From f38376c50c1459ad221927c76bb375344317f121 Mon Sep 17 00:00:00 2001 From: ttccxx Date: Fri, 7 Jul 2023 19:27:29 +0800 Subject: [PATCH] first commit --- .gitignore | 8 + LICENSE | 400 + README.md | 124 + configs/few-shot/dist_fewshot_sim_base.sh | 26 + configs/few-shot/slurm_fewshot_sim_base.sh | 34 + configs/finetune/dist_finetune_sim_base.sh | 31 + .../finetune/dist_finetune_sim_base_eval.sh | 33 + configs/finetune/slurm_finetune_sim_base.sh | 45 + .../finetune/slurm_finetune_sim_base_eval.sh | 46 + configs/linprobe/dist_linprobe_sim_base.sh | 34 + configs/linprobe/slurm_linprobe_sim_base.sh | 48 + configs/pretrain/dist_sim_base_1600ep.sh | 39 + configs/pretrain/slurm_sim_base_1600ep.sh | 51 + configs/semisup_rebuttal.sh | 32 + configs/semisup_sim_base_400ep.sh | 31 + configs/semisup_sim_large_1600ep.sh | 33 + docs/checkpoints.md | 20 + docs/few_shot.md | 19 + docs/finetune.md | 45 + docs/linear_eval.md | 25 + docs/prepare.md | 47 + docs/pretrain.md | 28 + engine_finetune.py | 131 + engine_pretrain.py | 130 + figs/comparison.png | Bin 0 -> 27526 bytes figs/overview.png | Bin 0 -> 26916 bytes imagenet_subset1/1percent.txt | 12811 ++++++++++++++++ main_finetune.py | 389 + main_linprobe.py | 348 + main_logistic.py | 494 + main_pretrain.py | 358 + models_sim.py | 515 + models_vit.py | 266 + util/augmentation.py | 161 + util/crop.py | 44 + util/datasets.py | 85 + util/lars.py | 49 + util/lr_decay.py | 91 + util/lr_sched.py | 24 + util/masking_generator.py | 132 + util/misc.py | 593 + util/pos_embed.py | 133 + util/tcs_datasets.py | 202 + 43 files changed, 18155 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 configs/few-shot/dist_fewshot_sim_base.sh create mode 100644 configs/few-shot/slurm_fewshot_sim_base.sh create mode 100644 configs/finetune/dist_finetune_sim_base.sh create mode 100644 configs/finetune/dist_finetune_sim_base_eval.sh create mode 100644 configs/finetune/slurm_finetune_sim_base.sh create mode 100644 configs/finetune/slurm_finetune_sim_base_eval.sh create mode 100644 configs/linprobe/dist_linprobe_sim_base.sh create mode 100644 configs/linprobe/slurm_linprobe_sim_base.sh create mode 100644 configs/pretrain/dist_sim_base_1600ep.sh create mode 100644 configs/pretrain/slurm_sim_base_1600ep.sh create mode 100644 configs/semisup_rebuttal.sh create mode 100644 configs/semisup_sim_base_400ep.sh create mode 100644 configs/semisup_sim_large_1600ep.sh create mode 100644 docs/checkpoints.md create mode 100644 docs/few_shot.md create mode 100644 docs/finetune.md create mode 100644 docs/linear_eval.md create mode 100644 docs/prepare.md create mode 100644 docs/pretrain.md create mode 100644 engine_finetune.py create mode 100644 engine_pretrain.py create mode 100644 figs/comparison.png create mode 100644 figs/overview.png create mode 100644 imagenet_subset1/1percent.txt create mode 100644 main_finetune.py create mode 100644 main_linprobe.py create mode 100644 main_logistic.py create mode 100644 main_pretrain.py create mode 100644 models_sim.py create mode 100644 models_vit.py create mode 100644 util/augmentation.py create mode 100644 util/crop.py create mode 100644 util/datasets.py create mode 100644 util/lars.py create mode 100644 util/lr_decay.py create mode 100644 util/lr_sched.py create mode 100644 util/masking_generator.py create mode 100644 util/misc.py create mode 100644 util/pos_embed.py create mode 100644 util/tcs_datasets.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..117565e --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +exp/ +**/__pycache__/ +*.pth +batchscript-* +phoenix-slurm-* +.ipynb_checkpoints/ +.idea/ +.vscode/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b7aecd0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,400 @@ + +Attribution-NonCommercial 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More_considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-NonCommercial 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-NonCommercial 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + i. NonCommercial means not primarily intended for or directed towards + commercial advantage or monetary compensation. For purposes of + this Public License, the exchange of the Licensed Material for + other material subject to Copyright and Similar Rights by digital + file-sharing or similar means is NonCommercial provided there is + no payment of monetary compensation in connection with the + exchange. + + j. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + k. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + l. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part, for NonCommercial purposes only; and + + b. produce, reproduce, and Share Adapted Material for + NonCommercial purposes only. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties, including when + the Licensed Material is used other than for NonCommercial + purposes. + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database for NonCommercial purposes + only; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the β€œLicensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..45ad0eb --- /dev/null +++ b/README.md @@ -0,0 +1,124 @@ +# SiameseIM + +By [Chenxin Tao](https://scholar.google.com/citations?user=sXHFIBkAAAAJ&hl=zh-CN), +[Xizhou Zhu](https://scholar.google.com/citations?user=02RXI00AAAAJ), +[Weijie Su](https://www.weijiesu.com/), +[Gao Huang](http://www.gaohuang.net/), +[Bin Li](http://staff.ustc.edu.cn/~binli/), +[Jie Zhou](https://scholar.google.com/citations?user=6a79aPwAAAAJ&hl=en), +[Yu Qiao](https://scholar.google.com.hk/citations?user=gFtI-8QAAAAJ&hl=en), +[Xiaogang Wang](http://www.ee.cuhk.edu.hk/~xgwang/), +[Jifeng Dai](https://jifengdai.org/) + +This is the official implementation of the CVPR 2023 paper [Siamese Image Modeling for Self-Supervised Vision Representation Learning](https://arxiv.org/pdf/2206.01204.pdf). + +![SiameseIM-overview](./figs/overview.png) + +## 🏠 Introduction + +SiameseIM is a new form of self-supervised learning that can learn semantic alignment and spatial sensitivity with a single dense loss. We note the following key observations from SiameseIM: + +- Compared with MIM methods, SiameseIM shows that reconstructing another view helps to obtain good semantic alignment. + +- Compared with ID methods, SiameseIM shows that dense supervision can be applied by matching the dense correspondence between two views strictly through their relative positions. + +- SiameseIM is able to surpass both MIM and ID methods over a wide range of tasks. SiameseIM obtains more improvements in few-shot, long-tail and robustness-concerned scenarios. + + +![SiameseIM-comparison](./figs/comparison.png) + + +## πŸ“ˆ Main Results + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ImageNetCOCOADE20kLVISRobustness
FTLIN1% FTAP boxAP maskmIoUAP boxAP box rareAP maskAP mask rareIN-A top-1IN-R top-1IN-Sketch top-1IN-C 1-mCE
MoCo-v3 (ID method)83.076.763.447.942.747.337.325.535.325.832.449.835.955.4
MAE (MIM method)83.668.051.151.645.948.140.129.338.129.135.948.334.548.3
SiameseIM84.178.065.152.146.251.140.530.938.130.143.852.538.357.1
Improve w.r.t. MoCo-v3+1.1+1.3+1.7+4.2+3.5+3.8+3.2+5.4+2.8+4.3+11.4+2.7+2.4+1.7
Improve w.r.t. MAE+0.5+10.0+14.0+0.5+0.3+3.0+0.4+1.6+0.0+1.0+7.9+4.2+3.8+8.8
+ + +Note: + +(1) Compared with MoCo-v3, SiameseIM improves dense prediction tasks (COCO detection, ADE20k segmentation, LVIS detection) significantly; + +(2) Compared with MAE, SiameseIM improves long-tail, few-shot, robustness tasks (ImageNet linear evaluation & few-shot classification, ADE20k segmentation, LVIS detection) significantly; + +(3) Notably, ADE20k segmentation and LVIS detection both contain long-tail classes, which put forward high requirement for semantic alignment, and detection tasks, which demand good spatial alignment. Thus, SiameseIM can surpass both MoCo-v3 and MAE by a large margin on these tasks. + + +## πŸ› οΈ Usage +### Preparation + +See [prepare.md](docs/prepare.md) + +### Model Checkpoint + +See [checkpoints.md](docs/checkpoints.md) + +### Pretrain + +See [pretrain.md](docs/pretrain.md) + +### Finetune + +See [finetune.md](docs/finetune.md) + +### Linear Evaluation + +See [linear_eval.md](docs/linear_eval.md) + +### Few-shot Evaluation + +See [few_shot.md](docs/few_shot.md) + +### COCO & LVIS Detection + +We use ViTDet for detection tasks, please refer to [detectron2](https://github.com/facebookresearch/detectron2/tree/main/projects/ViTDet). + +### ADE20k Segmentation + +We follow MAE to use UPerNet for segmentation task, please refer to [mmsegmentation](https://github.com/open-mmlab/mmsegmentation/tree/main/configs/mae). + +### Robustness Evaluation + +We evaluate the ImageNet finetuned model on [ImageNet-A](https://github.com/hendrycks/natural-adv-examples), [ImageNet-R](https://github.com/hendrycks/imagenet-r), [ImageNet-Sketch](https://github.com/HaohanWang/ImageNet-Sketch) and [ImageNet-C](https://github.com/hendrycks/robustness) datasets. + + +## πŸ“ƒ License + +This project is released under the [CC-BY-NC 4.0 license](./LICENSE). + +## πŸ–ŠοΈ Citing SiameseIM +If you find SiameseIM useful in your research, please consider citing: +```bibtex +@inproceedings{tao2023siamese, + title={Siamese image modeling for self-supervised vision representation learning}, + author={Tao, Chenxin and Zhu, Xizhou and Su, Weijie and Huang, Gao and Li, Bin and Zhou, Jie and Qiao, Yu and Wang, Xiaogang and Dai, Jifeng}, + booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, + pages={2132--2141}, + year={2023} +} +``` diff --git a/configs/few-shot/dist_fewshot_sim_base.sh b/configs/few-shot/dist_fewshot_sim_base.sh new file mode 100644 index 0000000..b739223 --- /dev/null +++ b/configs/few-shot/dist_fewshot_sim_base.sh @@ -0,0 +1,26 @@ +set -x + +IP=${1} +RANK=${2} +NNODES=${3} +CKPT_PATH=${4} +DATA_PATH=${5} +PORT=${PORT:-28500} +PY_ARGS=${PY_ARGS:-""} + +BASENAME=$(basename ${CKPT_PATH}) +EXP_NAME=$(basename $(dirname ${CKPT_PATH})) +DIR=./exp/fewshot/${EXP_NAME} + +python -m torch.distributed.launch --nproc_per_node=8 --nnodes=${NNODES} --node_rank=${RANK} --master_addr=${IP} --master_port=${PORT} \ + main_logistic.py \ + --subset-path imagenet_subset1/1percent.txt \ + --root-path ${DATA_PATH} \ + --image-folder imagenet_full_size/061417/ \ + --device cuda:0 \ + --pretrained ${CKPT_PATH} \ + --fname 'fewshot_1percent.pth' \ + --model-name 'vit_base_patch16' \ + --penalty l2 \ + --lambd 0.1 \ + --preload \ No newline at end of file diff --git a/configs/few-shot/slurm_fewshot_sim_base.sh b/configs/few-shot/slurm_fewshot_sim_base.sh new file mode 100644 index 0000000..5b0cd18 --- /dev/null +++ b/configs/few-shot/slurm_fewshot_sim_base.sh @@ -0,0 +1,34 @@ +set -x + +GPUS=${1} +GPUS_PER_NODE=${2} +QUOTATYPE=${3} +PARTITION=${4} +CKPT_PATH=${5} +DATA_PATH=${6} +CPUS_PER_TASK=${CPUS_PER_TASK:-12} + +BASENAME=$(basename ${CKPT_PATH}) +EXP_NAME=$(basename $(dirname ${CKPT_PATH})) +DIR=./exp/fewshot/${EXP_NAME} +JOB_NAME=fewshot-${EXP} + +srun --partition=${PARTITION} \ + --mpi=pmi2 \ + --quotatype=${QUOTATYPE} \ + --job-name=${JOB_NAME} \ + -n$GPUS \ + --gres=gpu:${GPUS_PER_NODE} \ + --ntasks-per-node=${GPUS_PER_NODE} \ + --cpus-per-task=$CPUS_PER_TASK \ + --kill-on-bad-exit=1 \ + python -W ignore -u main_logistic.py \ + --subset-path imagenet_subset1/1percent.txt \ + --root-path ${DATA_PATH} \ + --image-folder imagenet_full_size/061417/ \ + --device cuda:0 \ + --pretrained ${CKPT_PATH} \ + --fname 'fewshot_1percent.pth' \ + --model-name 'vit_base_patch16' \ + --penalty l2 \ + --lambd 0.1 \ No newline at end of file diff --git a/configs/finetune/dist_finetune_sim_base.sh b/configs/finetune/dist_finetune_sim_base.sh new file mode 100644 index 0000000..e9bba19 --- /dev/null +++ b/configs/finetune/dist_finetune_sim_base.sh @@ -0,0 +1,31 @@ +set -x + +IP=${1} +RANK=${2} +NNODES=${3} +CKPT_PATH=${4} +DATA_PATH=${5} +PORT=${PORT:-28500} +PY_ARGS=${PY_ARGS:-""} + +TOTAL_BATCH_SIZE=1024 +let BATCH_SIZE=${TOTAL_BATCH_SIZE}/${NNODES}/8 + +BASENAME=$(basename ${CKPT_PATH}) +EXP_NAME=$(basename $(dirname ${CKPT_PATH})) +DIR=./exp/finetune/${EXP_NAME} + +mkdir -p ${DIR} + +python -m torch.distributed.launch --nproc_per_node=8 --nnodes=${NNODES} --node_rank=${RANK} --master_addr=${IP} --master_port=${PORT} \ + main_finetune.py \ + --output_dir ${DIR} \ + --log_dir ${DIR} \ + --batch_size ${BATCH_SIZE} \ + --model vit_base_patch16 \ + --finetune ${CKPT_PATH} \ + --epochs 100 \ + --blr 2.5e-4 --layer_decay 0.65 \ + --weight_decay 0.05 --drop_path 0.1 --reprob 0.25 --mixup 0.8 --cutmix 1.0 \ + --dist_eval --data_path ${DATA_PATH} \ + ${PY_ARGS} 2>&1 | tee -a ${DIR}/stdout.txt \ No newline at end of file diff --git a/configs/finetune/dist_finetune_sim_base_eval.sh b/configs/finetune/dist_finetune_sim_base_eval.sh new file mode 100644 index 0000000..f14b058 --- /dev/null +++ b/configs/finetune/dist_finetune_sim_base_eval.sh @@ -0,0 +1,33 @@ +set -x + +IP=${1} +RANK=${2} +NNODES=${3} +CKPT_PATH=${4} +DATA_PATH=${5} +PORT=${PORT:-28500} +PY_ARGS=${PY_ARGS:-""} + +TOTAL_BATCH_SIZE=1024 +let BATCH_SIZE=${TOTAL_BATCH_SIZE}/${NNODES}/8 + +BASENAME=$(basename ${CKPT_PATH}) +EXP_NAME=$(basename $(dirname ${CKPT_PATH})) +DIR=./exp/finetune/${EXP_NAME} + +mkdir -p ${DIR} + +python -m torch.distributed.launch --nproc_per_node=8 --nnodes=${NNODES} --node_rank=${RANK} --master_addr=${IP} --master_port=${PORT} \ + main_finetune.py \ + --output_dir ${DIR} \ + --log_dir ${DIR} \ + --batch_size ${BATCH_SIZE} \ + --model vit_base_patch16 \ + --resume ${CKPT_PATH} \ + --epochs 100 \ + --blr 2.5e-4 --layer_decay 0.65 \ + --weight_decay 0.05 --drop_path 0.1 --reprob 0.25 --mixup 0.8 --cutmix 1.0 \ + --dist_eval --data_path ${DATA_PATH} \ + --eval \ + --use_tcs_dataset \ + ${PY_ARGS} 2>&1 | tee -a ${DIR}/stdout.txt \ No newline at end of file diff --git a/configs/finetune/slurm_finetune_sim_base.sh b/configs/finetune/slurm_finetune_sim_base.sh new file mode 100644 index 0000000..6ee6cc0 --- /dev/null +++ b/configs/finetune/slurm_finetune_sim_base.sh @@ -0,0 +1,45 @@ +set -x + +GPUS=${1} +GPUS_PER_NODE=${2} +QUOTATYPE=${3} +PARTITION=${4} +CPUS_PER_TASK=${CPUS_PER_TASK:-12} +CKPT_PATH=${5} +DATA_PATH=${6} +SRUN_ARGS=${SRUN_ARGS:-""} +PY_ARGS=${PY_ARGS:-""} + + +TOTAL_BATCH_SIZE=1024 +let BATCH_SIZE=${TOTAL_BATCH_SIZE}/${GPUS} + +BASENAME=$(basename ${CKPT_PATH}) +EXP_NAME=$(basename $(dirname ${CKPT_PATH})) +DIR=./exp/finetune/${EXP_NAME} +JOB_NAME=ft-${EXP} + +mkdir -p ${DIR} + +srun --partition=${PARTITION} \ + --mpi=pmi2 \ + --quotatype=${QUOTATYPE} \ + --job-name=${JOB_NAME} \ + -n$GPUS \ + --gres=gpu:${GPUS_PER_NODE} \ + --ntasks-per-node=${GPUS_PER_NODE} \ + --cpus-per-task=$CPUS_PER_TASK \ + --kill-on-bad-exit=1 \ + ${SRUN_ARGS} \ + python -u main_finetune.py \ + --output_dir ${DIR} \ + --log_dir ${DIR} \ + --batch_size ${BATCH_SIZE} \ + --model vit_base_patch16 \ + --finetune ${CKPT_PATH} \ + --epochs 100 \ + --blr 2.5e-4 --layer_decay 0.65 \ + --weight_decay 0.05 --drop_path 0.1 --reprob 0.25 --mixup 0.8 --cutmix 1.0 \ + --dist_eval --data_path ${DATA_PATH} \ + --use_tcs_dataset \ + ${PY_ARGS} 2>&1 | tee -a ${DIR}/stdout.txt diff --git a/configs/finetune/slurm_finetune_sim_base_eval.sh b/configs/finetune/slurm_finetune_sim_base_eval.sh new file mode 100644 index 0000000..7cf993e --- /dev/null +++ b/configs/finetune/slurm_finetune_sim_base_eval.sh @@ -0,0 +1,46 @@ +set -x + +GPUS=${1} +GPUS_PER_NODE=${2} +QUOTATYPE=${3} +PARTITION=${4} +CPUS_PER_TASK=${CPUS_PER_TASK:-12} +CKPT_PATH=${5} +DATA_PATH=${6} +SRUN_ARGS=${SRUN_ARGS:-""} +PY_ARGS=${PY_ARGS:-""} + + +TOTAL_BATCH_SIZE=1024 +let BATCH_SIZE=${TOTAL_BATCH_SIZE}/${GPUS} + +BASENAME=$(basename ${CKPT_PATH}) +EXP_NAME=$(basename $(dirname ${CKPT_PATH})) +DIR=./exp/finetune/${EXP_NAME} +JOB_NAME=ft-${EXP} + +mkdir -p ${DIR} + +srun --partition=${PARTITION} \ + --mpi=pmi2 \ + --quotatype=${QUOTATYPE} \ + --job-name=${JOB_NAME} \ + -n$GPUS \ + --gres=gpu:${GPUS_PER_NODE} \ + --ntasks-per-node=${GPUS_PER_NODE} \ + --cpus-per-task=$CPUS_PER_TASK \ + --kill-on-bad-exit=1 \ + ${SRUN_ARGS} \ + python -u main_finetune.py \ + --output_dir ${DIR} \ + --log_dir ${DIR} \ + --batch_size ${BATCH_SIZE} \ + --model vit_base_patch16 \ + --resume ${CKPT_PATH} \ + --epochs 100 \ + --blr 2.5e-4 --layer_decay 0.65 \ + --weight_decay 0.05 --drop_path 0.1 --reprob 0.25 --mixup 0.8 --cutmix 1.0 \ + --dist_eval --data_path ${DATA_PATH} \ + --eval \ + --use_tcs_dataset \ + ${PY_ARGS} 2>&1 | tee -a ${DIR}/stdout.txt diff --git a/configs/linprobe/dist_linprobe_sim_base.sh b/configs/linprobe/dist_linprobe_sim_base.sh new file mode 100644 index 0000000..d52050f --- /dev/null +++ b/configs/linprobe/dist_linprobe_sim_base.sh @@ -0,0 +1,34 @@ +set -x + +IP=${1} +RANK=${2} +NNODES=${3} +CKPT_PATH=${4} +DATA_PATH=${5} +PORT=${PORT:-28500} +PY_ARGS=${PY_ARGS:-""} + +TOTAL_BATCH_SIZE=16384 +let BATCH_SIZE=${TOTAL_BATCH_SIZE}/${NNODES}/8 + +BASENAME=$(basename ${CKPT_PATH}) +EXP_NAME=$(basename $(dirname ${CKPT_PATH})) +DIR=./exp/linear/${EXP_NAME} + +mkdir -p ${DIR} + +python -m torch.distributed.launch --nproc_per_node=8 --nnodes=${NNODES} --node_rank=${RANK} --master_addr=${IP} --master_port=${PORT} \ + main_linprobe.py \ + --batch_size ${BATCH_SIZE} \ + --model vit_base_patch16 \ + --finetune ${CKPT_PATH} \ + --epochs 90 \ + --blr 0.1 \ + --weight_decay 0.0 \ + --dist_eval \ + --output_dir ${DIR} \ + --log_dir ${DIR} \ + --global_pool \ + --data_path ${DATA_PATH} \ + --use_tcs_dataset \ + ${PY_ARGS} 2>&1 | tee -a ${DIR}/stdout.txt \ No newline at end of file diff --git a/configs/linprobe/slurm_linprobe_sim_base.sh b/configs/linprobe/slurm_linprobe_sim_base.sh new file mode 100644 index 0000000..ae7f5f3 --- /dev/null +++ b/configs/linprobe/slurm_linprobe_sim_base.sh @@ -0,0 +1,48 @@ +set -x + +GPUS=${1} +GPUS_PER_NODE=${2} +QUOTATYPE=${3} +PARTITION=${4} +CKPT_PATH=${5} +DATA_PATH=${6} +CPUS_PER_TASK=${CPUS_PER_TASK:-12} +SRUN_ARGS=${SRUN_ARGS:-""} +PY_ARGS=${PY_ARGS:-""} + + +TOTAL_BATCH_SIZE=16384 +let BATCH_SIZE=${TOTAL_BATCH_SIZE}/${GPUS} + +BASENAME=$(basename ${CKPT_PATH}) +EXP_NAME=$(basename $(dirname ${CKPT_PATH})) +DIR=./exp/linear/${EXP_NAME} +JOB_NAME=lin-${EXP} + +mkdir -p ${DIR} + +srun --partition=${PARTITION} \ + --mpi=pmi2 \ + --open-mode=append \ + --quotatype=${QUOTATYPE} \ + --job-name=${JOB_NAME} \ + -n$GPUS \ + --gres=gpu:${GPUS_PER_NODE} \ + --ntasks-per-node=${GPUS_PER_NODE} \ + --cpus-per-task=$CPUS_PER_TASK \ + --kill-on-bad-exit=1 \ + ${SRUN_ARGS} \ + python -u main_linprobe.py \ + --batch_size ${BATCH_SIZE} \ + --model vit_base_patch16 \ + --finetune ${CKPT_PATH} \ + --epochs 90 \ + --blr 0.1 \ + --weight_decay 0.0 \ + --dist_eval \ + --output_dir ${DIR} \ + --log_dir ${DIR} \ + --global_pool \ + --data_path ${DATA_PATH} \ + --use_tcs_dataset \ + ${PY_ARGS} 2>&1 | tee -a ${DIR}/stdout.txt \ No newline at end of file diff --git a/configs/pretrain/dist_sim_base_1600ep.sh b/configs/pretrain/dist_sim_base_1600ep.sh new file mode 100644 index 0000000..65a02fa --- /dev/null +++ b/configs/pretrain/dist_sim_base_1600ep.sh @@ -0,0 +1,39 @@ +set -x + +IP=${1} +RANK=${2} +NNODES=${3} +DATA_PATH=${4} +PORT=${PORT:-28500} +PY_ARGS=${PY_ARGS:-""} + +BASENAME=`basename ${0} .sh` +DIR=./exp/pretrain/${BASENAME} +mkdir -p ${DIR} + +TOTAL_BATCH_SIZE=4096 +let BATCH_SIZE=${TOTAL_BATCH_SIZE}/${NNODES}/8 + +EPOCHS=1600 + +python -m torch.distributed.launch --nproc_per_node=8 --nnodes=${NNODES} --node_rank=${RANK} --master_addr=${IP} --master_port=${PORT} \ + main_pretrain.py \ + --model sim_vit_base_patch16 \ + --decoder_embed_dim 768 \ + --batch_size ${BATCH_SIZE} \ + --epochs ${EPOCHS} \ + --warmup_epochs 40 \ + --crop_min 0.08 \ + --with_blockwise_mask \ + --blockwise_num_masking_patches 118 \ + --blr 6.25e-5 --weight_decay 0.05 \ + --mm 0.995 \ + --mmschedule 'cosine' \ + --clip_grad 1.0 \ + --loss_type 'sim' \ + --neg_weight 0.02 \ + --save_latest_freq 5 \ + --output_dir ${DIR} \ + --log_dir ${DIR} \ + --data_path ${DATA_PATH} \ + ${PY_ARGS} 2>&1 | tee -a ${DIR}/stdout.txt diff --git a/configs/pretrain/slurm_sim_base_1600ep.sh b/configs/pretrain/slurm_sim_base_1600ep.sh new file mode 100644 index 0000000..b4d829c --- /dev/null +++ b/configs/pretrain/slurm_sim_base_1600ep.sh @@ -0,0 +1,51 @@ +set -x + +GPUS=${1} +GPUS_PER_NODE=${2} +JOB_NAME=${3} +QUOTATYPE=${4} +PARTITION=${5} +DATA_PATH=${6} +CPUS_PER_TASK=${CPUS_PER_TASK:-8} +SRUN_ARGS=${SRUN_ARGS:-""} +PY_ARGS=${PY_ARGS:-""} + +BASENAME=`basename ${0} .sh` +DIR=./exp/pretrain/${BASENAME} +mkdir -p ${DIR} + +TOTAL_BATCH_SIZE=4096 +let BATCH_SIZE=${TOTAL_BATCH_SIZE}/${GPUS} + +EPOCHS=1600 + +srun --partition=${PARTITION} \ + --mpi=pmi2 \ + --quotatype=${QUOTATYPE} \ + --job-name=${JOB_NAME} \ + -n$GPUS \ + --gres=gpu:${GPUS_PER_NODE} \ + --ntasks-per-node=${GPUS_PER_NODE} \ + --cpus-per-task=$CPUS_PER_TASK \ + --kill-on-bad-exit=1 \ + ${SRUN_ARGS} \ + python -u main_pretrain.py \ + --model sim_vit_base_patch16 \ + --decoder_embed_dim 768 \ + --batch_size ${BATCH_SIZE} \ + --epochs ${EPOCHS} \ + --warmup_epochs 40 \ + --crop_min 0.08 \ + --with_blockwise_mask \ + --blockwise_num_masking_patches 118 \ + --blr 6.25e-5 --weight_decay 0.05 \ + --mm 0.995 \ + --mmschedule 'cosine' \ + --clip_grad 1.0 \ + --loss_type 'sim' \ + --neg_weight 0.02 \ + --save_latest_freq 5 \ + --output_dir ${DIR} \ + --log_dir ${DIR} \ + --data_path ${DATA_PATH} \ + ${PY_ARGS} 2>&1 | tee -a ${DIR}/stdout.txt diff --git a/configs/semisup_rebuttal.sh b/configs/semisup_rebuttal.sh new file mode 100644 index 0000000..e86e344 --- /dev/null +++ b/configs/semisup_rebuttal.sh @@ -0,0 +1,32 @@ +set -x + +GPUS=${1} +GPUS_PER_NODE=${2} +JOB_NAME=${3} +QUOTATYPE=${4} +PARTITION=${5} +CPUS_PER_TASK=${CPUS_PER_TASK:-5} + +DIR=./exp/semisup_ibot_400ep +CKPT=./ckpt/ibot.pth + +srun --partition=vc_research_${PARTITION} \ + --mpi=pmi2 \ + --quotatype=${QUOTATYPE} \ + --job-name=${JOB_NAME} \ + -n$GPUS \ + --gres=gpu:${GPUS_PER_NODE} \ + --ntasks-per-node=${GPUS_PER_NODE} \ + --cpus-per-task=$CPUS_PER_TASK \ + --kill-on-bad-exit=1 \ + --dependency=singleton \ + python -W ignore -u main_logistic.py \ + --subset-path imagenet_subset1/1percent.txt \ + --root-path /mnt/cache/share/images \ + --image-folder imagenet_full_size/061417/ \ + --device cuda:0 \ + --pretrained ${CKPT} \ + --fname 'semisup.pth' \ + --model-name 'vit_base_patch16' \ + --penalty l2 \ + --lambd 0.1 \ No newline at end of file diff --git a/configs/semisup_sim_base_400ep.sh b/configs/semisup_sim_base_400ep.sh new file mode 100644 index 0000000..21e2d2f --- /dev/null +++ b/configs/semisup_sim_base_400ep.sh @@ -0,0 +1,31 @@ +set -x + +GPUS=${1} +GPUS_PER_NODE=${2} +JOB_NAME=${3} +QUOTATYPE=${4} +PARTITION=${5} +CPUS_PER_TASK=${CPUS_PER_TASK:-5} + +DIR=./exp/semisup_sim_base_1600ep +CKPT=./exp/pretrain_sim_base_400ep/checkpoint-399.pth + +srun --partition=vc_research_${PARTITION} \ + --mpi=pmi2 \ + --quotatype=${QUOTATYPE} \ + --job-name=${JOB_NAME} \ + -n$GPUS \ + --gres=gpu:${GPUS_PER_NODE} \ + --ntasks-per-node=${GPUS_PER_NODE} \ + --cpus-per-task=$CPUS_PER_TASK \ + --kill-on-bad-exit=1 \ + python -W ignore -u main_logistic.py \ + --subset-path imagenet_subset1/1percent.txt \ + --root-path /mnt/cache/share/images \ + --image-folder imagenet_full_size/061417/ \ + --device cuda:0 \ + --pretrained ${CKPT} \ + --fname 'semisup.pth' \ + --model-name 'vit_base_patch16' \ + --penalty l2 \ + --lambd 0.1 \ No newline at end of file diff --git a/configs/semisup_sim_large_1600ep.sh b/configs/semisup_sim_large_1600ep.sh new file mode 100644 index 0000000..256943d --- /dev/null +++ b/configs/semisup_sim_large_1600ep.sh @@ -0,0 +1,33 @@ +set -x + +GPUS=${1} +GPUS_PER_NODE=${2} +JOB_NAME=${3} +QUOTATYPE=${4} +PARTITION=${5} +CPUS_PER_TASK=${CPUS_PER_TASK:-5} + +DIR=./exp/semisup_sim_large_1600ep +CKPT=./exp/pretrain_sim_large_1600ep/checkpoint-latest.pth + +srun --partition=vc_research_${PARTITION} \ + --mpi=pmi2 \ + --quotatype=${QUOTATYPE} \ + --job-name=${JOB_NAME} \ + -n$GPUS \ + --gres=gpu:${GPUS_PER_NODE} \ + --ntasks-per-node=${GPUS_PER_NODE} \ + --cpus-per-task=$CPUS_PER_TASK \ + --kill-on-bad-exit=1 \ + --dependency=singleton \ + -x SH-IDC1-10-142-5-[45,13,70,198],SH-IDC1-10-142-4-[187,93,188,46,165,83,151,146,26] \ + python -W ignore -u main_logistic.py \ + --subset-path imagenet_subset1/1percent.txt \ + --root-path /mnt/cache/share/images \ + --image-folder imagenet_full_size/061417/ \ + --device cuda:0 \ + --pretrained ${CKPT} \ + --fname 'semisup.pth' \ + --model-name 'vit_large_patch16' \ + --penalty l2 \ + --lambd 0.01 \ No newline at end of file diff --git a/docs/checkpoints.md b/docs/checkpoints.md new file mode 100644 index 0000000..ef9529c --- /dev/null +++ b/docs/checkpoints.md @@ -0,0 +1,20 @@ +# Checkpoints +We provide links for you to download the checkpoints of SiameseIM models here. + + + + + + + + + + + + + +
ModelBackbonePretrained EpochFinetuned on ImageNetLink
SiameseIMViT-Base1600w/oDownload
SiameseIMftViT-Base1600w/Download
+ +* The SiameseIM model is only pretrained on ImageNet datasets for 1600 epochs. For pretraining details, see [pretrain.md](./pretrain.md). +* The SiameseIM$`_{\mathrm{ft}}`$ model is first pretrained for 1600 epochs, and the finetuned with ImageNet classification task for 100 epochs. For finetuning details, see [finetune.md](./finetune.md). +* More pre-trained weights will be released. diff --git a/docs/few_shot.md b/docs/few_shot.md new file mode 100644 index 0000000..8a72f9c --- /dev/null +++ b/docs/few_shot.md @@ -0,0 +1,19 @@ +# Few-shot Evaluation + +We provide the few-shot evaluation scripts here. We only use 1% ImageNet labelled data to train the model. We follow [MSN](https://github.com/facebookresearch/msn/blob/main/logistic_eval.py) to train a linear classifier on the representation, without tuning model's parameters. + +## Train with torch.distributed.launch +Few-shot evaluation does not require high computational resources, so it is enough to run the scripts on a single node, shown as follows. + +``` + sh ./configs/few-shot/dist_fewshot_sim_base.sh ${MASTER_ADDR} 0 1 ${CKPT_PATH} ${DATA_PATH} +``` + +Note: +The `${MASTER_ADDR}` is the ip address of rank 0 node. The second and third arguments specify the node rank and node number respectively. You need to adjust them if different node numbders are used. + +## Train on a slurm cluster +If you need to run the few-shot evaluation on a slurm cluster, use the command below to run on `${GPUS}/${GPUS_PER_NODE}` nodes with `${GPUS_PER_NODE}` gpus on each node: +``` + sh ./configs/few-shot/slurm_fewshot_sim_base.sh ${GPUS} ${GPUS_PER_NODE} ${QUOTATYPE} ${PARTITION} ${CKPT_PATH} ${DATA_PATH} +``` diff --git a/docs/finetune.md b/docs/finetune.md new file mode 100644 index 0000000..8905741 --- /dev/null +++ b/docs/finetune.md @@ -0,0 +1,45 @@ +# Finetune + +We provide the finetuning scripts here. To finetune a SiameseIM model, it is recommended that +* use 1024 batch size, which should fit into 8 V100 gpus with 32G memory; +* We provide the finetuned checkpoint in [checkpoints.md](./checkpoints.md). + +## Train with torch.distributed.launch +This method supports training on multi-nodes with torch.distributed.launch. For example, to finetune a SiameseIM model on 2 nodes, run the command below. + +On node 1: +``` + sh ./configs/finetune/dist_finetune_sim_base.sh ${MASTER_ADDR} 0 2 ${CKPT_PATH} ${DATA_PATH} +``` + +On node 2: +``` + sh ./configs/finetune/dist_finetune_sim_base.sh ${MASTER_ADDR} 1 2 ${CKPT_PATH} ${DATA_PATH} +``` + +Note: +The `${MASTER_ADDR}` is the ip address of rank 0 node. The second and third arguments specify the node rank and node number respectively. You need to adjust them if different node numbders are used. + +## Train on a slurm cluster +If you need to run the finetuning on a slurm cluster, use the command below to run on `${GPUS}/${GPUS_PER_NODE}` nodes with `${GPUS_PER_NODE}` gpus on each node: +``` + sh ./configs/finetune/slurm_finetune_sim_base.sh ${GPUS} ${GPUS_PER_NODE} ${QUOTATYPE} ${PARTITION} ${CKPT_PATH} ${DATA_PATH} +``` + +## Evaluation +We also provide the evaluation scripts as follows. + +For torch.distributed.launch, use +``` + sh ./configs/finetune/dist_finetune_sim_base_eval.sh ${MASTER_ADDR} 0 1 ${CKPT_PATH} ${DATA_PATH} +``` + +For slurm launch, use +``` + sh ./configs/finetune/slurm_finetune_sim_base_eval.sh ${GPUS} ${GPUS_PER_NODE} ${QUOTATYPE} ${PARTITION} ${CKPT_PATH} ${DATA_PATH} +``` +You should get +``` +* Acc@1 84.118 Acc@5 96.766 loss 0.728 +``` +for the provided checkpoint. diff --git a/docs/linear_eval.md b/docs/linear_eval.md new file mode 100644 index 0000000..f6227c3 --- /dev/null +++ b/docs/linear_eval.md @@ -0,0 +1,25 @@ +# Linear Evaluation + +We provide the linear evaluation scripts here. The evaluation setting mainly follows MAE, which uses 16384 batch size and LARS optimizer. + +## Train with torch.distributed.launch +This method supports training on multi-nodes with torch.distributed.launch. For example, to conduct linear evaluation on 2 nodes, run the command below. + +On node 1: +``` + sh ./configs/linprobe/dist_linprobe_sim_base.sh ${MASTER_ADDR} 0 2 ${CKPT_PATH} ${DATA_PATH} +``` + +On node 2: +``` + sh ./configs/linprobe/dist_linprobe_sim_base.sh ${MASTER_ADDR} 1 2 ${CKPT_PATH} ${DATA_PATH} +``` + +Note: +The `${MASTER_ADDR}` is the ip address of rank 0 node. The second and third arguments specify the node rank and node number respectively. You need to adjust them if different node numbders are used. + +## Train on a slurm cluster +If you need to run the linear evaluation on a slurm cluster, use the command below to run on `${GPUS}/${GPUS_PER_NODE}` nodes with `${GPUS_PER_NODE}` gpus on each node: +``` + sh ./configs/linprobe/slurm_linprobe_sim_base.sh ${GPUS} ${GPUS_PER_NODE} ${QUOTATYPE} ${PARTITION} ${CKPT_PATH} ${DATA_PATH} +``` diff --git a/docs/prepare.md b/docs/prepare.md new file mode 100644 index 0000000..07c171f --- /dev/null +++ b/docs/prepare.md @@ -0,0 +1,47 @@ +# Preparation + +* The only dataset required in this repo is ImageNet, which is enough for pretraining, finetuning, linear evaluation and few-shot evaluation. If you want to evaluate on COCO, LVIS, ADE20k and robustness datasets, please follow the corresponding repos to prepare the data. + +## Installation + +* Python >=3.7 +* We recommend to use Pytorch1.11 for a faster training speed. +* timm == 0.6.12 + +To run few-shot evaluation, [cyanure](https://github.com/inria-thoth/cyanure) package is further required. You can install it with +``` + pip install cyanure-openblas + # or pip install cyanure-mkl +``` + +## Data preparation + +Download and extract ImageNet train and val images from http://image-net.org/. +The directory structure is the standard layout for the torchvision [`datasets.ImageFolder`](https://pytorch.org/docs/stable/torchvision/datasets.html#imagefolder), and the training and validation data is expected to be in the `train/` folder and `val` folder respectively: + +``` + /path/to/imagenet/ + β”œβ”€β”€ train/ + β”‚Β Β  β”œβ”€β”€ class1/ + β”‚ β”‚Β Β  β”œβ”€β”€ img1.JPEG + | β”‚Β Β  β”œβ”€β”€ img2.JPEG + | β”‚Β Β  β”œβ”€β”€ img3.JPEG + | β”‚Β Β  └── ... + β”‚Β Β  β”œβ”€β”€ class2/ + | β”‚Β Β  └── ... + β”‚Β Β  β”œβ”€β”€ class3/ + | β”‚Β Β  └── ... + | └── ... + └─── val + β”‚Β Β  β”œβ”€β”€ class1/ + β”‚ β”‚Β Β  β”œβ”€β”€ img4.JPEG + | β”‚Β Β  β”œβ”€β”€ img5.JPEG + | β”‚Β Β  β”œβ”€β”€ img6.JPEG + | β”‚Β Β  └── ... + β”‚Β Β  β”œβ”€β”€ class2/ + | β”‚Β Β  └── ... + β”‚Β Β  β”œβ”€β”€ class3/ + | β”‚Β Β  └── ... +``` + +Note that raw val images are not put into class folders, use [this script](https://github.com/pytorch/examples/blob/main/imagenet/extract_ILSVRC.sh) to get correct layout. diff --git a/docs/pretrain.md b/docs/pretrain.md new file mode 100644 index 0000000..df81f3a --- /dev/null +++ b/docs/pretrain.md @@ -0,0 +1,28 @@ +# Pretrain + +We provide the pretraining scripts here. To pretrain a SiameseIM model, it is recommended that +* use 4096 batch size, which should fit into 32 V100 gpus with 32G memory; +* pretrain for 1600 epochs for better performance. We also note that pretraining SiameseIM for 400 epochs can already match the performances of 1600 epoch MAE on some tasks; +* We provide the 1600 epoch pretrained checkpoint in [checkpoints.md](./checkpoints.md). + +## Train with torch.distributed.launch +This method supports training on multi-nodes with torch.distributed.launch. For example, to pretrain a SiameseIM model on 2 nodes, run the command below. + +On node 1: +``` + sh ./configs/pretrain/dist_sim_base_1600ep.sh ${MASTER_ADDR} 0 2 ${DATA_PATH} +``` + +On node 2: +``` + sh ./configs/pretrain/dist_sim_base_1600ep.sh ${MASTER_ADDR} 1 2 ${DATA_PATH} +``` + +Note: +The `${MASTER_ADDR}` is the ip address of rank 0 node. The second and third arguments specify the node rank and node number respectively. You need to adjust them if different node numbders are used. + +## Train on a slurm cluster +If you need to run the pretraining on a slurm cluster, use the command below to run on `${GPUS}/${GPUS_PER_NODE}` nodes with `${GPUS_PER_NODE}` gpus on each node: +``` + sh ./configs/pretrain/slurm_sim_base_1600ep.sh ${GPUS} ${GPUS_PER_NODE} ${JOB_NAME} ${QUOTATYPE} ${PARTITION} ${DATA_PATH} +``` diff --git a/engine_finetune.py b/engine_finetune.py new file mode 100644 index 0000000..32c52fa --- /dev/null +++ b/engine_finetune.py @@ -0,0 +1,131 @@ +# ------------------------------------------------------------------------ +# SiameseIM +# Copyright (c) SenseTime. All Rights Reserved. +# ------------------------------------------------------------------------ +# Modified from MAE (https://github.com/facebookresearch/mae) +# Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved. +# ------------------------------------------------------------------------ +# References: +# BEiT: https://github.com/microsoft/unilm/tree/master/beit +# DeiT: https://github.com/facebookresearch/deit +# ------------------------------------------------------------------------ + +import math +import sys +from typing import Iterable, Optional + +import torch + +from timm.data import Mixup +from timm.utils import accuracy + +import util.misc as misc +import util.lr_sched as lr_sched + + +def train_one_epoch(model: torch.nn.Module, criterion: torch.nn.Module, + data_loader: Iterable, optimizer: torch.optim.Optimizer, + device: torch.device, epoch: int, loss_scaler, max_norm: float = 0, + mixup_fn: Optional[Mixup] = None, log_writer=None, + args=None): + model.train(True) + metric_logger = misc.MetricLogger(delimiter=" ") + metric_logger.add_meter('lr', misc.SmoothedValue(window_size=1, fmt='{value:.6f}')) + header = 'Epoch: [{}]'.format(epoch) + print_freq = 20 + + accum_iter = args.accum_iter + + optimizer.zero_grad() + + if log_writer is not None: + print('log_dir: {}'.format(log_writer.log_dir)) + + for data_iter_step, (samples, targets) in enumerate(metric_logger.log_every(data_loader, print_freq, header)): + + # we use a per iteration (instead of per epoch) lr scheduler + if data_iter_step % accum_iter == 0: + lr_sched.adjust_learning_rate(optimizer, data_iter_step / len(data_loader) + epoch, args) + + samples = samples.to(device, non_blocking=True) + targets = targets.to(device, non_blocking=True) + + if mixup_fn is not None: + samples, targets = mixup_fn(samples, targets) + + with torch.cuda.amp.autocast(): + outputs = model(samples) + loss = criterion(outputs, targets) + + loss_value = loss.item() + + if not math.isfinite(loss_value): + print("Loss is {}, stopping training".format(loss_value)) + sys.exit(1) + + loss /= accum_iter + loss_scaler(loss, optimizer, clip_grad=max_norm, + parameters=model.parameters(), create_graph=False, + update_grad=(data_iter_step + 1) % accum_iter == 0) + if (data_iter_step + 1) % accum_iter == 0: + optimizer.zero_grad() + + torch.cuda.synchronize() + + metric_logger.update(loss=loss_value) + min_lr = 10. + max_lr = 0. + for group in optimizer.param_groups: + min_lr = min(min_lr, group["lr"]) + max_lr = max(max_lr, group["lr"]) + + metric_logger.update(lr=max_lr) + + loss_value_reduce = misc.all_reduce_mean(loss_value) + if log_writer is not None and (data_iter_step + 1) % accum_iter == 0: + """ We use epoch_1000x as the x-axis in tensorboard. + This calibrates different curves when batch size changes. + """ + epoch_1000x = int((data_iter_step / len(data_loader) + epoch) * 1000) + log_writer.add_scalar('loss', loss_value_reduce, epoch_1000x) + log_writer.add_scalar('lr', max_lr, epoch_1000x) + + # gather the stats from all processes + metric_logger.synchronize_between_processes() + print("Averaged stats:", metric_logger) + return {k: meter.global_avg for k, meter in metric_logger.meters.items()} + + +@torch.no_grad() +def evaluate(data_loader, model, device): + criterion = torch.nn.CrossEntropyLoss() + + metric_logger = misc.MetricLogger(delimiter=" ") + header = 'Test:' + + # switch to evaluation mode + model.eval() + + for batch in metric_logger.log_every(data_loader, 10, header): + images = batch[0] + target = batch[-1] + images = images.to(device, non_blocking=True) + target = target.to(device, non_blocking=True) + + # compute output + with torch.cuda.amp.autocast(): + output = model(images) + loss = criterion(output, target) + + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + + batch_size = images.shape[0] + metric_logger.update(loss=loss.item()) + metric_logger.meters['acc1'].update(acc1.item(), n=batch_size) + metric_logger.meters['acc5'].update(acc5.item(), n=batch_size) + # gather the stats from all processes + metric_logger.synchronize_between_processes() + print('* Acc@1 {top1.global_avg:.3f} Acc@5 {top5.global_avg:.3f} loss {losses.global_avg:.3f}' + .format(top1=metric_logger.acc1, top5=metric_logger.acc5, losses=metric_logger.loss)) + + return {k: meter.global_avg for k, meter in metric_logger.meters.items()} diff --git a/engine_pretrain.py b/engine_pretrain.py new file mode 100644 index 0000000..6a4f57f --- /dev/null +++ b/engine_pretrain.py @@ -0,0 +1,130 @@ +# ------------------------------------------------------------------------ +# SiameseIM +# Copyright (c) SenseTime. All Rights Reserved. +# ------------------------------------------------------------------------ +# Modified from MAE (https://github.com/facebookresearch/mae) +# Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved. +# ------------------------------------------------------------------------ +# References: +# BEiT: https://github.com/microsoft/unilm/tree/master/beit +# DeiT: https://github.com/facebookresearch/deit +# ------------------------------------------------------------------------ + + +import math +import os +import sys +from turtle import update +from typing import Iterable +from pathlib import Path + +import torch + +import util.misc as misc +import util.lr_sched as lr_sched + + +def train_one_epoch(model: torch.nn.Module, + data_loader: Iterable, optimizer: torch.optim.Optimizer, + device: torch.device, epoch: int, loss_scaler, + log_writer=None, + args=None): + model.train(True) + metric_logger = misc.MetricLogger(delimiter=" ") + metric_logger.add_meter('lr', misc.SmoothedValue(window_size=1, fmt='{value:.6f}')) + header = 'Epoch: [{}]'.format(epoch) + print_freq = 50 + + accum_iter = args.accum_iter + + optimizer.zero_grad() + + if log_writer is not None: + print('log_dir: {}'.format(log_writer.log_dir)) + + for data_iter_step, data in enumerate(metric_logger.log_every(data_loader, print_freq, header)): + if args.with_blockwise_mask: + samples, labels, mask = data + else: + samples, labels = data + mask = None + + # we use a per iteration (instead of per epoch) lr scheduler + if data_iter_step % accum_iter == 0: + lr_sched.adjust_learning_rate(optimizer, data_iter_step / len(data_loader) + epoch, args) + + if args.mmschedule == 'const': + mm = args.mm + elif args.mmschedule == 'cosine': + mm = 1. - 0.5 * (1. + math.cos(math.pi * (data_iter_step / len(data_loader) + epoch) / args.epochs)) * (1. - args.mm) + metric_logger.update(mm=mm) + update_mm = (data_iter_step % accum_iter == 0) + + if args.loss_type in ['sim',]: + x1, x2, delta_i, delta_j, delta_h, delta_w, relative_flip, flip_delta_j = samples + x1 = x1.to(device, non_blocking=True) + x2 = x2.to(device, non_blocking=True) + delta_i = delta_i.to(x1) + delta_j = delta_j.to(x1) + delta_h = delta_h.to(x1) + delta_w = delta_w.to(x1) + flip_delta_j = flip_delta_j.to(x1) + + rel_pos_21 = (delta_i, delta_j, delta_h, delta_w, relative_flip, flip_delta_j) + + with torch.cuda.amp.autocast(enabled=(not args.fp32)): + loss, outputs = model(x1, x2, rel_pos_21, mm, update_mm, mask=mask) + metric_logger.update(**outputs) + else: + samples = samples.to(device, non_blocking=True) + + with torch.cuda.amp.autocast(enabled=(not args.fp32)): + loss, _, _ = model(samples, mask_ratio=args.mask_ratio) + + loss_value = loss.item() + + if not math.isfinite(loss_value): + print("Loss is {}, stopping training".format(loss_value)) + sys.exit(1) + + loss /= accum_iter + grad_norm = loss_scaler(loss, optimizer, parameters=model.parameters(), + update_grad=(data_iter_step + 1) % accum_iter == 0, clip_grad=args.clip_grad) + if args.fp32: + loss_scale = None + else: + loss_scale = loss_scaler.state_dict()['scale'] + + metric_logger.update(grad_norm=grad_norm) + metric_logger.update(loss_scale=loss_scale) + + if (data_iter_step + 1) % accum_iter == 0: + optimizer.zero_grad() + + torch.cuda.synchronize() + + metric_logger.update(loss=loss_value) + + lr = optimizer.param_groups[0]["lr"] + metric_logger.update(lr=lr) + + loss_value_reduce = misc.all_reduce_mean(loss_value) + outputs_reduced = {k_: misc.all_reduce_mean(v_) for k_, v_ in outputs.items()} + if log_writer is not None and (data_iter_step + 1) % accum_iter == 0: + """ We use epoch_1000x as the x-axis in tensorboard. + This calibrates different curves when batch size changes. + """ + epoch_1000x = int((data_iter_step / len(data_loader) + epoch) * 1000) + log_writer.add_scalar('train_loss', loss_value_reduce, epoch_1000x) + log_writer.add_scalar('lr', lr, epoch_1000x) + log_writer.add_scalar('grad_norm', grad_norm, epoch_1000x) + if loss_scale is not None: + log_writer.add_scalar('loss_scale', loss_scale, epoch_1000x) + log_writer.add_scalar('mm', mm, epoch_1000x) + for k_, v_ in outputs_reduced.items(): + log_writer.add_scalar(f'train/{k_}', v_, epoch_1000x) + + # gather the stats from all processes + metric_logger.synchronize_between_processes() + print("Averaged stats:", metric_logger) + return {k: meter.global_avg for k, meter in metric_logger.meters.items()} diff --git a/figs/comparison.png b/figs/comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..e86ecf053dd4b6ecd0570c640411cc0e1162636e GIT binary patch literal 27526 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 literal 0 HcmV?d00001 diff --git a/figs/overview.png b/figs/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..09ec32bd430fa8217988f8fec9e311ccf6d4ad8d GIT binary patch literal 26916 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 E0f9x2asU7T literal 0 HcmV?d00001 diff --git a/imagenet_subset1/1percent.txt b/imagenet_subset1/1percent.txt new file mode 100644 index 0000000..33c8b75 --- /dev/null +++ b/imagenet_subset1/1percent.txt @@ -0,0 +1,12811 @@ +n04235860_14959.JPEG +n04239074_7724.JPEG +n02096294_8485.JPEG +n07760859_4412.JPEG +n02037110_4941.JPEG +n01443537_18335.JPEG +n02408429_3302.JPEG +n03337140_34411.JPEG +n01749939_3831.JPEG +n04070727_58656.JPEG +n03530642_16803.JPEG +n04536866_12765.JPEG +n01729977_14276.JPEG +n02120079_278.JPEG +n03976657_24073.JPEG +n02793495_898.JPEG +n02102480_9032.JPEG +n03717622_6603.JPEG +n02089867_5681.JPEG +n04371430_20882.JPEG +n07684084_2522.JPEG +n03623198_4294.JPEG +n01739381_571.JPEG +n04229816_9211.JPEG +n03691459_65725.JPEG +n02116738_4591.JPEG +n01944390_1986.JPEG +n04525305_19804.JPEG +n03874599_6348.JPEG +n04392985_4828.JPEG +n02807133_2045.JPEG +n01518878_5620.JPEG +n03345487_245.JPEG +n04501370_8885.JPEG +n02951585_10223.JPEG +n02963159_10049.JPEG +n02165456_18280.JPEG +n03706229_4937.JPEG +n02860847_21758.JPEG +n02071294_1103.JPEG +n02342885_7417.JPEG +n01695060_2336.JPEG +n04417672_1297.JPEG +n02841315_24523.JPEG +n04162706_1547.JPEG +n04328186_12425.JPEG +n03494278_31382.JPEG +n03956157_1336.JPEG +n04355338_9160.JPEG +n04557648_1888.JPEG +n02231487_9476.JPEG +n02088364_12078.JPEG +n02011460_4861.JPEG +n03786901_18195.JPEG +n02667093_3894.JPEG +n02106382_389.JPEG +n02109047_42.JPEG +n02834397_28326.JPEG +n02051845_8082.JPEG +n04540053_13998.JPEG +n01518878_4298.JPEG +n04613696_6444.JPEG +n02808304_12774.JPEG +n04153751_1138.JPEG +n03761084_13709.JPEG +n03782006_3984.JPEG +n03272562_3307.JPEG +n02134418_1800.JPEG +n03345487_1142.JPEG +n03457902_44629.JPEG +n03871628_13455.JPEG +n03017168_13663.JPEG +n02124075_3191.JPEG +n02231487_2597.JPEG +n01494475_26287.JPEG +n03884397_4700.JPEG +n03075370_9470.JPEG +n04264628_20807.JPEG +n07754684_15684.JPEG +n04125021_25079.JPEG +n01514668_12627.JPEG +n09421951_12732.JPEG +n03042490_10467.JPEG +n03259280_6263.JPEG +n01945685_10492.JPEG +n07930864_63392.JPEG +n02102040_2325.JPEG +n02090379_570.JPEG +n04120489_2495.JPEG +n03125729_14759.JPEG +n07730033_12695.JPEG +n01847000_14464.JPEG +n03201208_26293.JPEG +n02219486_28433.JPEG +n02099267_3290.JPEG +n02481823_20471.JPEG +n01978287_10109.JPEG +n01537544_9249.JPEG +n01833805_27879.JPEG +n01698640_11457.JPEG +n03633091_12914.JPEG +n04201297_7271.JPEG +n07720875_2774.JPEG +n07875152_5543.JPEG +n04201297_3386.JPEG +n02085936_3217.JPEG +n04461696_5124.JPEG +n01530575_10169.JPEG +n02011460_3986.JPEG +n01530575_5494.JPEG +n03920288_3395.JPEG +n03425413_21162.JPEG +n03126707_32441.JPEG +n02259212_362.JPEG +n02110806_24156.JPEG +n03100240_14239.JPEG +n03623198_14441.JPEG +n02484975_13316.JPEG +n04597913_5618.JPEG +n02607072_4.JPEG +n03785016_5962.JPEG +n02090622_5684.JPEG +n03992509_301.JPEG +n04037443_46482.JPEG +n06359193_20739.JPEG +n01740131_12735.JPEG +n07720875_7674.JPEG +n03929660_10002.JPEG +n07717410_9606.JPEG +n02963159_9909.JPEG +n04417672_16111.JPEG +n02174001_11393.JPEG +n01990800_5957.JPEG +n02110185_10298.JPEG +n07768694_2467.JPEG +n02090721_768.JPEG +n03733281_41598.JPEG +n04008634_5061.JPEG +n15075141_9000.JPEG +n03697007_2018.JPEG +n03207941_14904.JPEG +n04356056_6955.JPEG +n04476259_7174.JPEG +n02027492_2756.JPEG +n09835506_20256.JPEG +n03196217_5.JPEG +n03785016_6644.JPEG +n04479046_8117.JPEG +n04273569_3348.JPEG +n07697537_1765.JPEG +n03345487_7487.JPEG +n04458633_7981.JPEG +n01601694_6296.JPEG +n02105641_11432.JPEG +n04154565_8539.JPEG +n02165105_130.JPEG +n03017168_16445.JPEG +n04487394_24511.JPEG +n02445715_8795.JPEG +n03063599_3967.JPEG +n01632458_1585.JPEG +n03425413_11370.JPEG +n04090263_5068.JPEG +n09472597_39294.JPEG +n01494475_6893.JPEG +n03063689_10162.JPEG +n09421951_31635.JPEG +n02510455_1439.JPEG +n02013706_7840.JPEG +n12144580_16466.JPEG +n02422699_24588.JPEG +n02106550_7907.JPEG +n02279972_11953.JPEG +n03532672_38006.JPEG +n04456115_9090.JPEG +n03476991_44843.JPEG +n02859443_1249.JPEG +n02088466_1302.JPEG +n03417042_3104.JPEG +n01882714_10996.JPEG +n01531178_6095.JPEG +n12144580_410.JPEG +n03584829_4843.JPEG +n04259630_6476.JPEG +n03804744_2951.JPEG +n01806143_3396.JPEG +n04311004_3577.JPEG +n02092002_8848.JPEG +n02974003_4036.JPEG +n02093754_2630.JPEG +n02100236_2398.JPEG +n01882714_14419.JPEG +n02437312_11298.JPEG +n04270147_8875.JPEG +n03763968_5716.JPEG +n04350905_2635.JPEG +n02094258_5674.JPEG +n02883205_5134.JPEG +n02981792_12436.JPEG +n04522168_35504.JPEG +n03825788_24424.JPEG +n01641577_6998.JPEG +n02840245_4721.JPEG +n02749479_3070.JPEG +n04417672_13170.JPEG +n02500267_241.JPEG +n03337140_34760.JPEG +n04039381_7524.JPEG +n07749582_5017.JPEG +n02093754_1887.JPEG +n02484975_11906.JPEG +n04482393_10600.JPEG +n02403003_3821.JPEG +n02096051_159.JPEG +n02167151_3789.JPEG +n01514668_7647.JPEG +n02086646_8723.JPEG +n02099849_1638.JPEG +n12998815_8005.JPEG +n03937543_2192.JPEG +n01945685_2390.JPEG +n03124043_13194.JPEG +n01677366_46492.JPEG +n04252077_3137.JPEG +n02095314_3730.JPEG +n01608432_4329.JPEG +n03417042_10105.JPEG +n02133161_2741.JPEG +n02096437_967.JPEG +n01774750_18.JPEG +n03457902_14430.JPEG +n03045698_7092.JPEG +n02077923_8207.JPEG +n04251144_29322.JPEG +n03777568_3395.JPEG +n02113712_7057.JPEG +n03840681_41114.JPEG +n02169497_2728.JPEG +n01601694_1080.JPEG +n10565667_14239.JPEG +n02097474_17311.JPEG +n07831146_5702.JPEG +n04525038_12886.JPEG +n02454379_4337.JPEG +n03623198_528.JPEG +n07880968_6197.JPEG +n07730033_3699.JPEG +n04536866_5676.JPEG +n03832673_14836.JPEG +n02093256_3834.JPEG +n03457902_37731.JPEG +n06596364_717.JPEG +n01833805_567.JPEG +n02951358_13538.JPEG +n03291819_7138.JPEG +n04612504_18291.JPEG +n07714990_2250.JPEG +n03089624_62711.JPEG +n03000684_3679.JPEG +n04125021_103.JPEG +n03930630_7387.JPEG +n03843555_7676.JPEG +n03888257_17004.JPEG +n02859443_4875.JPEG +n01534433_3695.JPEG +n02791124_1581.JPEG +n03991062_28827.JPEG +n02093256_7027.JPEG +n03584254_3735.JPEG +n02097658_11459.JPEG +n02058221_4824.JPEG +n03529860_17832.JPEG +n07615774_49235.JPEG +n02167151_8364.JPEG +n03125729_9731.JPEG +n02094258_5614.JPEG +n04259630_3225.JPEG +n04355338_971.JPEG +n07747607_2815.JPEG +n01775062_5400.JPEG +n02281787_4115.JPEG +n01739381_1265.JPEG +n03208938_11838.JPEG +n03854065_8897.JPEG +n03976657_19130.JPEG +n01871265_4602.JPEG +n03857828_36503.JPEG +n07753113_2422.JPEG +n06596364_16895.JPEG +n04346328_5145.JPEG +n02100735_3271.JPEG +n01773549_2620.JPEG +n02114712_14035.JPEG +n03937543_5710.JPEG +n03908714_5553.JPEG +n02497673_1849.JPEG +n04458633_1139.JPEG +n02948072_37829.JPEG +n02279972_4728.JPEG +n03924679_4318.JPEG +n02892201_537.JPEG +n07718747_11299.JPEG +n02804414_2323.JPEG +n11939491_4462.JPEG +n02877765_4024.JPEG +n01930112_11212.JPEG +n02105505_6431.JPEG +n04612504_2046.JPEG +n01644373_14186.JPEG +n02099849_447.JPEG +n03710721_141.JPEG +n02457408_381.JPEG +n02090379_4056.JPEG +n02091032_1531.JPEG +n02097209_8619.JPEG +n02113712_12688.JPEG +n02123159_2127.JPEG +n04515003_15715.JPEG +n02113978_6010.JPEG +n03658185_19620.JPEG +n02018207_2162.JPEG +n02109047_18776.JPEG +n03498962_32644.JPEG +n02669723_13523.JPEG +n02497673_7007.JPEG +n04525305_10650.JPEG +n04355933_5124.JPEG +n04418357_13945.JPEG +n03690938_6367.JPEG +n03929660_20418.JPEG +n02422699_11994.JPEG +n04542943_8957.JPEG +n04275548_15681.JPEG +n02013706_319.JPEG +n02092339_3.JPEG +n04049303_7791.JPEG +n03062245_3274.JPEG +n03595614_4762.JPEG +n01558993_3204.JPEG +n03814639_6064.JPEG +n02012849_6429.JPEG +n04552348_15369.JPEG +n03000134_2607.JPEG +n02667093_96.JPEG +n03930313_1234.JPEG +n03903868_46952.JPEG +n03649909_10292.JPEG +n02066245_18433.JPEG +n03063689_12908.JPEG +n03874293_1889.JPEG +n03777754_1471.JPEG +n07711569_4339.JPEG +n02107142_52465.JPEG +n03733805_2656.JPEG +n03388183_3982.JPEG +n02256656_13152.JPEG +n03065424_27114.JPEG +n09288635_3757.JPEG +n04357314_13897.JPEG +n02871525_6678.JPEG +n01872401_692.JPEG +n07768694_11933.JPEG +n04065272_4475.JPEG +n03347037_9891.JPEG +n09399592_115824.JPEG +n03223299_9372.JPEG +n01514859_12245.JPEG +n03692522_13334.JPEG +n04467665_68157.JPEG +n01751748_2861.JPEG +n03720891_2187.JPEG +n09835506_11997.JPEG +n04141076_38086.JPEG +n02492660_5736.JPEG +n02128385_3722.JPEG +n03854065_1854.JPEG +n03617480_443.JPEG +n03871628_7711.JPEG +n02443114_4309.JPEG +n02089973_13.JPEG +n02089867_1974.JPEG +n04019541_58046.JPEG +n04493381_73698.JPEG +n02085620_10171.JPEG +n04086273_3451.JPEG +n07860988_15585.JPEG +n02117135_2937.JPEG +n02096294_876.JPEG +n10565667_13854.JPEG +n03770439_33254.JPEG +n02484975_606.JPEG +n02966687_8885.JPEG +n03938244_28225.JPEG +n02417914_1607.JPEG +n03868863_2584.JPEG +n03476991_13596.JPEG +n03075370_12873.JPEG +n03763968_6472.JPEG +n03930630_12349.JPEG +n02447366_33404.JPEG +n02091467_9740.JPEG +n02086910_7514.JPEG +n09229709_42791.JPEG +n03314780_1740.JPEG +n04275548_8679.JPEG +n03344393_8756.JPEG +n03967562_13376.JPEG +n03720891_10938.JPEG +n03908714_6565.JPEG +n02319095_301.JPEG +n01704323_17430.JPEG +n01729322_5918.JPEG +n03803284_2114.JPEG +n02483362_10481.JPEG +n03786901_13428.JPEG +n02091032_4100.JPEG +n04118538_5708.JPEG +n12998815_19999.JPEG +n03179701_18074.JPEG +n02835271_3308.JPEG +n02708093_4597.JPEG +n03637318_16602.JPEG +n02086910_762.JPEG +n02917067_13607.JPEG +n02906734_32179.JPEG +n11879895_7752.JPEG +n02190166_4235.JPEG +n04277352_35453.JPEG +n04204347_2899.JPEG +n04209133_9485.JPEG +n02971356_26882.JPEG +n03347037_13556.JPEG +n07697537_5651.JPEG +n03623198_5610.JPEG +n03623198_10515.JPEG +n01871265_19240.JPEG +n09256479_6955.JPEG +n03337140_14265.JPEG +n03691459_47816.JPEG +n02114367_5282.JPEG +n02504458_10112.JPEG +n04264628_1010.JPEG +n02807133_2412.JPEG +n03124170_4558.JPEG +n04277352_14105.JPEG +n04371774_15008.JPEG +n01592084_786.JPEG +n02786058_8938.JPEG +n02981792_23418.JPEG +n02492660_437.JPEG +n03633091_16141.JPEG +n02090379_2032.JPEG +n03017168_23682.JPEG +n03788195_58722.JPEG +n04554684_14004.JPEG +n03742115_5319.JPEG +n01843065_10577.JPEG +n01978455_8229.JPEG +n04347754_6197.JPEG +n03873416_7626.JPEG +n03042490_15624.JPEG +n02443484_8474.JPEG +n02229544_7262.JPEG +n03781244_110259.JPEG +n02992211_38210.JPEG +n06794110_6871.JPEG +n02690373_6872.JPEG +n01748264_19240.JPEG +n02268853_5164.JPEG +n09193705_12588.JPEG +n01968897_10471.JPEG +n04040759_8566.JPEG +n04532670_3299.JPEG +n03947888_4786.JPEG +n02490219_3680.JPEG +n02906734_5178.JPEG +n03837869_3747.JPEG +n03000247_74117.JPEG +n03095699_21533.JPEG +n09256479_5524.JPEG +n01833805_10605.JPEG +n02607072_3407.JPEG +n04067472_3934.JPEG +n02981792_10377.JPEG +n01514668_43700.JPEG +n04154565_25567.JPEG +n02321529_5809.JPEG +n13044778_6573.JPEG +n01667114_9985.JPEG +n04367480_11301.JPEG +n02504458_6412.JPEG +n02500267_7969.JPEG +n01729322_2595.JPEG +n04033995_46797.JPEG +n01775062_1284.JPEG +n02095889_5935.JPEG +n02089973_9112.JPEG +n03249569_21279.JPEG +n03208938_25189.JPEG +n04296562_39530.JPEG +n03196217_1111.JPEG +n01664065_7074.JPEG +n02123045_6445.JPEG +n01682714_26307.JPEG +n07860988_402.JPEG +n03777568_1898.JPEG +n03937543_5236.JPEG +n03584829_47965.JPEG +n01739381_5032.JPEG +n03417042_18268.JPEG +n02115641_1674.JPEG +n02018207_9499.JPEG +n03461385_17082.JPEG +n04487394_9822.JPEG +n03485794_36125.JPEG +n09332890_29433.JPEG +n03065424_15740.JPEG +n01491361_6098.JPEG +n01669191_18286.JPEG +n02607072_4570.JPEG +n02128757_14486.JPEG +n04023962_1795.JPEG +n02111500_6965.JPEG +n01828970_4614.JPEG +n04428191_5099.JPEG +n01704323_2311.JPEG +n07836838_12016.JPEG +n02093428_16083.JPEG +n02102040_904.JPEG +n02363005_1145.JPEG +n02105162_2021.JPEG +n01873310_10189.JPEG +n13133613_42063.JPEG +n01614925_5550.JPEG +n02690373_1933.JPEG +n04456115_21101.JPEG +n04208210_7517.JPEG +n02099849_4021.JPEG +n03976467_8207.JPEG +n04398044_8469.JPEG +n03445777_8343.JPEG +n02640242_19060.JPEG +n01983481_17344.JPEG +n02988304_7031.JPEG +n03733281_6046.JPEG +n04372370_12410.JPEG +n03709823_821.JPEG +n02106030_15096.JPEG +n04074963_3483.JPEG +n04579145_382.JPEG +n01773797_4510.JPEG +n03478589_12387.JPEG +n04332243_11817.JPEG +n02085620_11221.JPEG +n06596364_11265.JPEG +n03201208_25152.JPEG +n01955084_3986.JPEG +n02114712_12516.JPEG +n04398044_3392.JPEG +n03950228_29216.JPEG +n02268853_612.JPEG +n02027492_771.JPEG +n12620546_50419.JPEG +n03483316_4900.JPEG +n03197337_5747.JPEG +n02486261_5298.JPEG +n02174001_5062.JPEG +n04136333_950.JPEG +n03680355_14766.JPEG +n01614925_34338.JPEG +n01877812_3706.JPEG +n02790996_11337.JPEG +n01773549_327.JPEG +n06874185_5032.JPEG +n02447366_5858.JPEG +n02096177_7774.JPEG +n07248320_82318.JPEG +n01704323_9292.JPEG +n02843684_195.JPEG +n02793495_3942.JPEG +n03871628_12429.JPEG +n04442312_10000.JPEG +n02093859_3591.JPEG +n07714571_11121.JPEG +n02105412_247.JPEG +n04540053_10996.JPEG +n03425413_18874.JPEG +n03063599_4647.JPEG +n02279972_2951.JPEG +n01614925_13908.JPEG +n02910353_3113.JPEG +n02114712_1275.JPEG +n04548362_69294.JPEG +n02486410_6090.JPEG +n04606251_1351.JPEG +n02835271_3135.JPEG +n04208210_59145.JPEG +n03710193_4987.JPEG +n02492035_9108.JPEG +n02190166_11635.JPEG +n01773797_3252.JPEG +n04590129_14945.JPEG +n02102040_6652.JPEG +n02017213_7549.JPEG +n01824575_11212.JPEG +n04579145_2195.JPEG +n09472597_43051.JPEG +n02006656_4925.JPEG +n04596742_5934.JPEG +n03697007_2707.JPEG +n02494079_4325.JPEG +n02093647_6474.JPEG +n04554684_34683.JPEG +n03124170_7524.JPEG +n03602883_15439.JPEG +n02666196_11397.JPEG +n04591713_5856.JPEG +n04252077_7861.JPEG +n04200800_32971.JPEG +n04264628_4660.JPEG +n02168699_2919.JPEG +n04507155_34901.JPEG +n12057211_8203.JPEG +n01734418_14847.JPEG +n04613696_8091.JPEG +n03272010_12655.JPEG +n04263257_10887.JPEG +n03680355_4222.JPEG +n02441942_19309.JPEG +n02509815_3002.JPEG +n02480495_2398.JPEG +n02219486_24137.JPEG +n02104365_6732.JPEG +n03627232_12618.JPEG +n04346328_19275.JPEG +n02096177_8209.JPEG +n02107683_2714.JPEG +n02795169_30635.JPEG +n03676483_117.JPEG +n03208938_29224.JPEG +n02086646_9361.JPEG +n02871525_2764.JPEG +n02089973_2151.JPEG +n02979186_10866.JPEG +n02089867_4956.JPEG +n04355933_8042.JPEG +n03250847_6414.JPEG +n09229709_15095.JPEG +n02091134_852.JPEG +n10148035_13713.JPEG +n01770081_9041.JPEG +n03841143_2203.JPEG +n02097474_862.JPEG +n04116512_58077.JPEG +n03063689_19780.JPEG +n01560419_1872.JPEG +n03630383_11266.JPEG +n03976467_12860.JPEG +n02190166_5341.JPEG +n04243546_25797.JPEG +n02009229_5200.JPEG +n01632458_378.JPEG +n03980874_1098.JPEG +n02097474_3187.JPEG +n03642806_19719.JPEG +n03710721_21213.JPEG +n02992529_5284.JPEG +n02130308_18264.JPEG +n02730930_5085.JPEG +n12768682_17155.JPEG +n01704323_14600.JPEG +n03110669_99328.JPEG +n01729977_18657.JPEG +n02480495_22432.JPEG +n02088238_3086.JPEG +n02107683_5364.JPEG +n04179913_7831.JPEG +n02814860_24133.JPEG +n04366367_1084.JPEG +n02097658_129.JPEG +n03538406_992.JPEG +n02006656_10624.JPEG +n02096177_7817.JPEG +n02088364_7076.JPEG +n03877472_13789.JPEG +n03998194_24646.JPEG +n01530575_9359.JPEG +n07716358_14854.JPEG +n13133613_10860.JPEG +n03793489_4494.JPEG +n01667114_4848.JPEG +n04552348_6340.JPEG +n03492542_20649.JPEG +n01675722_4030.JPEG +n04258138_609.JPEG +n02701002_6467.JPEG +n03729826_3586.JPEG +n02113186_14787.JPEG +n07697313_11605.JPEG +n03476991_13265.JPEG +n04346328_20696.JPEG +n02981792_12653.JPEG +n04273569_10524.JPEG +n03188531_5236.JPEG +n03793489_51543.JPEG +n01514668_13962.JPEG +n04418357_6830.JPEG +n03792972_22238.JPEG +n07754684_13686.JPEG +n02137549_5858.JPEG +n03482405_4973.JPEG +n02492660_11368.JPEG +n01774750_3399.JPEG +n09399592_4798.JPEG +n07745940_20469.JPEG +n06785654_27674.JPEG +n02091134_15846.JPEG +n03530642_28978.JPEG +n02277742_10477.JPEG +n07718472_1103.JPEG +n13133613_76560.JPEG +n02219486_4596.JPEG +n02769748_28877.JPEG +n02672831_19200.JPEG +n04235860_11528.JPEG +n02099601_6699.JPEG +n01558993_31659.JPEG +n02916936_9476.JPEG +n01592084_4097.JPEG +n03902125_6188.JPEG +n06785654_11946.JPEG +n02791124_7315.JPEG +n02939185_9576.JPEG +n02129604_11428.JPEG +n04111531_14758.JPEG +n12998815_4117.JPEG +n04254120_3363.JPEG +n01560419_1964.JPEG +n02113624_1031.JPEG +n15075141_8971.JPEG +n03841143_32593.JPEG +n07693725_8788.JPEG +n03873416_22785.JPEG +n04344873_7278.JPEG +n04118776_33984.JPEG +n09428293_34330.JPEG +n07584110_21533.JPEG +n03388183_7462.JPEG +n03777754_2109.JPEG +n03180011_8345.JPEG +n02085782_3744.JPEG +n07717410_11984.JPEG +n02128757_5441.JPEG +n01518878_699.JPEG +n03670208_10949.JPEG +n07579787_7753.JPEG +n03866082_3543.JPEG +n02115913_1996.JPEG +n09428293_2126.JPEG +n07715103_15079.JPEG +n07714990_7345.JPEG +n02110627_7065.JPEG +n03255030_10682.JPEG +n09421951_24981.JPEG +n07711569_5483.JPEG +n02437616_1567.JPEG +n03724870_19320.JPEG +n02607072_4957.JPEG +n02497673_8009.JPEG +n07715103_11449.JPEG +n07875152_4419.JPEG +n03729826_28227.JPEG +n04487394_37293.JPEG +n02356798_4261.JPEG +n04517823_25320.JPEG +n04404412_5352.JPEG +n01843065_7056.JPEG +n02815834_4932.JPEG +n02823750_11074.JPEG +n02087046_11486.JPEG +n04596742_41163.JPEG +n02672831_33890.JPEG +n03956157_4112.JPEG +n02112018_2632.JPEG +n03874293_9657.JPEG +n02281406_6517.JPEG +n02417914_3238.JPEG +n02403003_26243.JPEG +n02105855_13303.JPEG +n02099601_6052.JPEG +n02229544_16335.JPEG +n01756291_14507.JPEG +n04023962_5110.JPEG +n02704792_1267.JPEG +n04033901_4724.JPEG +n02791270_25393.JPEG +n04389033_19103.JPEG +n04131690_9342.JPEG +n02119022_3843.JPEG +n02091831_2245.JPEG +n04376876_10240.JPEG +n03775546_8773.JPEG +n03032252_8239.JPEG +n02879718_26847.JPEG +n03662601_27589.JPEG +n07753113_9250.JPEG +n02879718_12448.JPEG +n02860847_8566.JPEG +n04356056_19382.JPEG +n02389026_6717.JPEG +n02276258_9997.JPEG +n02168699_3608.JPEG +n03272010_12521.JPEG +n01695060_28284.JPEG +n02129165_2293.JPEG +n03980874_4477.JPEG +n01775062_8221.JPEG +n04599235_3244.JPEG +n03014705_16164.JPEG +n04347754_94268.JPEG +n13044778_5170.JPEG +n03733805_2042.JPEG +n02006656_1105.JPEG +n04179913_14597.JPEG +n02128925_5329.JPEG +n02105412_3019.JPEG +n13052670_476.JPEG +n02807133_5700.JPEG +n02096051_8947.JPEG +n03590841_5451.JPEG +n01632777_3084.JPEG +n02415577_6949.JPEG +n04074963_11068.JPEG +n03776460_15230.JPEG +n04120489_4740.JPEG +n03854065_11432.JPEG +n01770393_18418.JPEG +n01592084_3337.JPEG +n02105251_3825.JPEG +n03291819_7174.JPEG +n03877472_59832.JPEG +n03792782_27435.JPEG +n02095314_1945.JPEG +n01558993_13570.JPEG +n02895154_38042.JPEG +n02917067_16716.JPEG +n04442312_18255.JPEG +n02099849_8764.JPEG +n03970156_1360.JPEG +n02749479_4208.JPEG +n02966193_40519.JPEG +n04141076_14748.JPEG +n02056570_13462.JPEG +n02802426_16339.JPEG +n01667114_16519.JPEG +n02096585_6917.JPEG +n02107683_2544.JPEG +n03773504_8135.JPEG +n02802426_5834.JPEG +n03929855_3561.JPEG +n04258138_1261.JPEG +n01689811_6227.JPEG +n04251144_277.JPEG +n02321529_9662.JPEG +n04266014_2746.JPEG +n02105056_14920.JPEG +n03457902_36243.JPEG +n01843065_3503.JPEG +n03720891_12137.JPEG +n01737021_5707.JPEG +n03062245_3254.JPEG +n07716906_3516.JPEG +n02389026_6641.JPEG +n07730033_14306.JPEG +n04254680_11888.JPEG +n04162706_32890.JPEG +n03733281_8768.JPEG +n04483307_17491.JPEG +n04141975_19817.JPEG +n02264363_10177.JPEG +n02883205_18433.JPEG +n01872401_3089.JPEG +n02879718_17230.JPEG +n04501370_1643.JPEG +n02096177_130.JPEG +n03417042_3146.JPEG +n04553703_2899.JPEG +n02268443_10282.JPEG +n01877812_4375.JPEG +n02105251_8560.JPEG +n03388549_9060.JPEG +n02165105_1962.JPEG +n15075141_9907.JPEG +n09421951_12575.JPEG +n07754684_22466.JPEG +n01819313_1119.JPEG +n02113799_1047.JPEG +n06874185_20206.JPEG +n03297495_3880.JPEG +n02977058_25011.JPEG +n03355925_16355.JPEG +n03868242_5462.JPEG +n03709823_5922.JPEG +n02790996_9267.JPEG +n03272562_8299.JPEG +n01986214_22894.JPEG +n03216828_30796.JPEG +n02410509_7181.JPEG +n04254680_1247.JPEG +n04509417_2130.JPEG +n07714990_7595.JPEG +n01820546_2571.JPEG +n02977058_19487.JPEG +n03124043_5240.JPEG +n02101556_6498.JPEG +n01871265_3688.JPEG +n04147183_5706.JPEG +n02268853_2383.JPEG +n03599486_12147.JPEG +n03485407_3040.JPEG +n07873807_16138.JPEG +n03062245_4548.JPEG +n01560419_4137.JPEG +n02129165_10216.JPEG +n01498041_357.JPEG +n02167151_1540.JPEG +n01629819_1005.JPEG +n07930864_18076.JPEG +n02676566_4916.JPEG +n07695742_2372.JPEG +n04254777_11566.JPEG +n03594945_30885.JPEG +n02825657_3744.JPEG +n01641577_21765.JPEG +n01776313_11361.JPEG +n02509815_2427.JPEG +n02504458_837.JPEG +n03131574_8175.JPEG +n02085620_3742.JPEG +n02108000_714.JPEG +n03483316_2797.JPEG +n01770393_3380.JPEG +n04404412_25004.JPEG +n02114712_1214.JPEG +n03929855_1915.JPEG +n07836838_4802.JPEG +n03787032_6722.JPEG +n03690938_2321.JPEG +n03873416_16202.JPEG +n02837789_13052.JPEG +n03482405_29257.JPEG +n02106166_1236.JPEG +n03888257_59412.JPEG +n01664065_6478.JPEG +n01985128_8599.JPEG +n02497673_9963.JPEG +n03271574_24357.JPEG +n01491361_12196.JPEG +n03637318_38.JPEG +n01807496_12616.JPEG +n02105412_6873.JPEG +n07614500_1921.JPEG +n04252225_1606.JPEG +n02114712_13067.JPEG +n01693334_10398.JPEG +n02484975_2981.JPEG +n04146614_3949.JPEG +n03042490_5566.JPEG +n02169497_1741.JPEG +n04367480_25303.JPEG +n02788148_48793.JPEG +n02106030_4724.JPEG +n03775546_9100.JPEG +n03127747_7762.JPEG +n02113799_1233.JPEG +n02089867_515.JPEG +n02488291_141.JPEG +n03874599_4770.JPEG +n02107574_402.JPEG +n03314780_17158.JPEG +n03617480_10122.JPEG +n02865351_19603.JPEG +n03781244_18078.JPEG +n03770439_1729.JPEG +n03250847_503.JPEG +n01742172_4035.JPEG +n02965783_1645.JPEG +n02114367_2506.JPEG +n07697313_2141.JPEG +n02097298_12297.JPEG +n02110341_2135.JPEG +n03781244_3212.JPEG +n03447447_10046.JPEG +n03777568_16426.JPEG +n02093647_4032.JPEG +n03447447_9400.JPEG +n03924679_19445.JPEG +n02895154_15230.JPEG +n02134418_3630.JPEG +n04505470_4795.JPEG +n03126707_3938.JPEG +n04371430_23018.JPEG +n03146219_14952.JPEG +n03125729_14140.JPEG +n03785016_4068.JPEG +n03720891_9679.JPEG +n01677366_9586.JPEG +n03026506_566.JPEG +n03443371_627.JPEG +n03742115_8611.JPEG +n07831146_3447.JPEG +n03717622_3661.JPEG +n02093428_8152.JPEG +n01665541_4824.JPEG +n04418357_25699.JPEG +n03642806_7993.JPEG +n07684084_1026.JPEG +n02088632_1128.JPEG +n03388183_15798.JPEG +n09256479_777.JPEG +n12144580_11389.JPEG +n02504458_3122.JPEG +n07583066_15428.JPEG +n03594945_4128.JPEG +n02017213_4118.JPEG +n01818515_3201.JPEG +n02114367_2703.JPEG +n04254777_11129.JPEG +n04467665_63829.JPEG +n02791124_6377.JPEG +n02823750_3432.JPEG +n03388043_3732.JPEG +n02483362_11646.JPEG +n03602883_7840.JPEG +n02492035_4048.JPEG +n04238763_6012.JPEG +n03710193_5521.JPEG +n04311174_983.JPEG +n04067472_2994.JPEG +n02408429_6082.JPEG +n02112350_2870.JPEG +n03532672_16974.JPEG +n01693334_7314.JPEG +n04125021_16885.JPEG +n03920288_7437.JPEG +n04296562_12507.JPEG +n01560419_20808.JPEG +n04399382_52847.JPEG +n02823750_7065.JPEG +n02100583_5401.JPEG +n02892767_18005.JPEG +n02981792_7454.JPEG +n01534433_28281.JPEG +n04356056_446.JPEG +n02396427_18146.JPEG +n03961711_899.JPEG +n02504458_1210.JPEG +n07579787_4892.JPEG +n12998815_25428.JPEG +n02123045_8690.JPEG +n07745940_8719.JPEG +n02536864_9091.JPEG +n02125311_12375.JPEG +n02110627_17635.JPEG +n03240683_9861.JPEG +n03014705_32620.JPEG +n02099601_3364.JPEG +n03535780_17500.JPEG +n03697007_3727.JPEG +n01914609_18880.JPEG +n02107312_1842.JPEG +n02093428_18881.JPEG +n03290653_17355.JPEG +n03761084_43042.JPEG +n03444034_22236.JPEG +n04458633_3152.JPEG +n01744401_11188.JPEG +n02089078_1617.JPEG +n07695742_7738.JPEG +n02490219_2906.JPEG +n03690938_20972.JPEG +n02071294_9545.JPEG +n06596364_7534.JPEG +n03271574_4079.JPEG +n04389033_16994.JPEG +n02093754_5290.JPEG +n01944390_9311.JPEG +n02087046_6903.JPEG +n04550184_45956.JPEG +n03376595_15547.JPEG +n03063599_1891.JPEG +n09332890_3384.JPEG +n02109525_5448.JPEG +n12057211_4629.JPEG +n02056570_9207.JPEG +n03089624_3730.JPEG +n02018795_14312.JPEG +n04355338_9470.JPEG +n04553703_45592.JPEG +n03127925_24494.JPEG +n02093647_3705.JPEG +n01688243_849.JPEG +n02105056_12288.JPEG +n02971356_24547.JPEG +n03109150_25506.JPEG +n03888257_7046.JPEG +n04613696_2021.JPEG +n02486261_2030.JPEG +n01829413_4763.JPEG +n03201208_3204.JPEG +n01983481_29461.JPEG +n02090721_6979.JPEG +n07579787_893.JPEG +n02125311_41500.JPEG +n03956157_1818.JPEG +n04370456_4744.JPEG +n01796340_21408.JPEG +n02843684_4719.JPEG +n02104029_160.JPEG +n03134739_10508.JPEG +n02895154_29298.JPEG +n02259212_3617.JPEG +n02794156_11179.JPEG +n03124170_4180.JPEG +n01669191_4529.JPEG +n02128925_60404.JPEG +n02422699_477.JPEG +n03637318_21770.JPEG +n02071294_15154.JPEG +n02002556_16935.JPEG +n02112350_769.JPEG +n04238763_1465.JPEG +n01817953_712.JPEG +n07880968_6906.JPEG +n02002724_15410.JPEG +n01687978_4370.JPEG +n01734418_869.JPEG +n02837789_17997.JPEG +n01860187_1815.JPEG +n03110669_60773.JPEG +n03791053_12587.JPEG +n03680355_22555.JPEG +n02124075_11785.JPEG +n02110806_3240.JPEG +n04152593_33645.JPEG +n02264363_4612.JPEG +n02105251_3939.JPEG +n03372029_5711.JPEG +n04591713_1496.JPEG +n03376595_7880.JPEG +n04483307_12121.JPEG +n03133878_4025.JPEG +n02490219_4858.JPEG +n02865351_23327.JPEG +n03127925_3022.JPEG +n01773157_2824.JPEG +n02497673_6163.JPEG +n04258138_6673.JPEG +n02108000_773.JPEG +n03223299_30762.JPEG +n02229544_2974.JPEG +n04589890_3820.JPEG +n12985857_4698.JPEG +n02980441_25431.JPEG +n02493793_6612.JPEG +n04371430_9012.JPEG +n04435653_13720.JPEG +n02098105_3045.JPEG +n04501370_3190.JPEG +n04532106_11338.JPEG +n02104029_4442.JPEG +n06785654_11953.JPEG +n04493381_56241.JPEG +n04372370_35267.JPEG +n03445924_1205.JPEG +n03814906_36835.JPEG +n02106550_225.JPEG +n02655020_41702.JPEG +n03584829_29492.JPEG +n03376595_8024.JPEG +n03400231_21274.JPEG +n04154565_7683.JPEG +n03868863_3628.JPEG +n02486410_4371.JPEG +n06785654_1165.JPEG +n02169497_3729.JPEG +n02871525_38401.JPEG +n02105641_14402.JPEG +n04371430_3343.JPEG +n03788195_20522.JPEG +n04209239_11815.JPEG +n02088364_8433.JPEG +n07714571_3321.JPEG +n03785016_46.JPEG +n07590611_12732.JPEG +n04590129_5569.JPEG +n04487394_16850.JPEG +n02667093_4132.JPEG +n02256656_6672.JPEG +n07875152_4171.JPEG +n02486261_18485.JPEG +n02488702_3740.JPEG +n02422106_9605.JPEG +n07717556_6933.JPEG +n03938244_30403.JPEG +n04447861_7448.JPEG +n02102480_7580.JPEG +n02226429_9807.JPEG +n02125311_53822.JPEG +n03492542_11168.JPEG +n07613480_17267.JPEG +n04505470_1843.JPEG +n02128925_19513.JPEG +n03633091_14829.JPEG +n04486054_1.JPEG +n04542943_5587.JPEG +n02094258_1221.JPEG +n01496331_10903.JPEG +n03452741_2174.JPEG +n03131574_23585.JPEG +n04111531_8673.JPEG +n04604644_8106.JPEG +n03692522_72.JPEG +n04146614_1732.JPEG +n02910353_13258.JPEG +n03733805_19076.JPEG +n12267677_13247.JPEG +n03400231_11402.JPEG +n04552348_5803.JPEG +n07753592_8465.JPEG +n03018349_5195.JPEG +n15075141_1638.JPEG +n03457902_31087.JPEG +n02488702_484.JPEG +n01806567_4679.JPEG +n02123159_10286.JPEG +n07873807_3353.JPEG +n04344873_9726.JPEG +n01729977_1519.JPEG +n03530642_1951.JPEG +n04033901_22763.JPEG +n02895154_5731.JPEG +n03026506_368.JPEG +n03599486_1459.JPEG +n02927161_10055.JPEG +n03095699_23336.JPEG +n01675722_9207.JPEG +n03983396_22954.JPEG +n07753275_22602.JPEG +n04258138_1960.JPEG +n03134739_1805.JPEG +n02009229_19315.JPEG +n02129165_15613.JPEG +n02012849_4704.JPEG +n02056570_7332.JPEG +n02102973_2473.JPEG +n02233338_14484.JPEG +n02107312_7215.JPEG +n02105162_10399.JPEG +n04266014_3133.JPEG +n02492035_6220.JPEG +n04579432_1860.JPEG +n02504458_4261.JPEG +n03187595_5057.JPEG +n02086079_1282.JPEG +n01695060_6412.JPEG +n04592741_5566.JPEG +n01682714_5212.JPEG +n02965783_2409.JPEG +n02125311_6360.JPEG +n02108551_870.JPEG +n04019541_766.JPEG +n07579787_929.JPEG +n02099601_6362.JPEG +n03388043_2881.JPEG +n01843383_2279.JPEG +n01770081_1581.JPEG +n03355925_8324.JPEG +n03047690_50465.JPEG +n02119022_8358.JPEG +n04443257_14909.JPEG +n01978455_11508.JPEG +n02865351_11365.JPEG +n02231487_5637.JPEG +n02027492_3213.JPEG +n07920052_17785.JPEG +n01944390_2099.JPEG +n04118538_5419.JPEG +n03764736_2789.JPEG +n02085936_3598.JPEG +n02669723_4451.JPEG +n03617480_14997.JPEG +n02002556_23286.JPEG +n02807133_7240.JPEG +n03584829_17644.JPEG +n01773797_6719.JPEG +n04392985_17750.JPEG +n02871525_18130.JPEG +n02027492_10116.JPEG +n02442845_31606.JPEG +n02097130_4613.JPEG +n04332243_2664.JPEG +n02107142_6060.JPEG +n02909870_32312.JPEG +n02110627_15918.JPEG +n01440764_5698.JPEG +n12985857_1724.JPEG +n04392985_12300.JPEG +n02095570_9229.JPEG +n07836838_766.JPEG +n02115641_3494.JPEG +n01749939_4356.JPEG +n02951585_21901.JPEG +n04542943_3246.JPEG +n02281787_4656.JPEG +n03095699_33416.JPEG +n02906734_14815.JPEG +n03345487_7151.JPEG +n02788148_44018.JPEG +n03733131_6945.JPEG +n04550184_44282.JPEG +n01443537_3037.JPEG +n02105505_1424.JPEG +n01698640_1337.JPEG +n01819313_722.JPEG +n03759954_4056.JPEG +n02027492_1594.JPEG +n01728920_9064.JPEG +n04146614_15680.JPEG +n04296562_29920.JPEG +n02488702_6249.JPEG +n02127052_4235.JPEG +n02134084_14538.JPEG +n01494475_5066.JPEG +n03535780_50409.JPEG +n02090379_3886.JPEG +n02412080_11475.JPEG +n02088094_2846.JPEG +n03788195_18029.JPEG +n02916936_1266.JPEG +n07718472_11247.JPEG +n03761084_18958.JPEG +n03000247_81994.JPEG +n02071294_21785.JPEG +n02788148_3974.JPEG +n04542943_279.JPEG +n02443114_332.JPEG +n02033041_1571.JPEG +n01753488_13471.JPEG +n07753592_9728.JPEG +n02730930_18756.JPEG +n02791124_6999.JPEG +n02389026_9722.JPEG +n03724870_5271.JPEG +n09472597_14878.JPEG +n01685808_1211.JPEG +n02701002_803.JPEG +n02025239_17827.JPEG +n09229709_52370.JPEG +n02281406_4078.JPEG +n03041632_22752.JPEG +n02095314_5206.JPEG +n04350905_50624.JPEG +n07716358_25308.JPEG +n02692877_6687.JPEG +n02481823_6233.JPEG +n04346328_14706.JPEG +n01829413_2486.JPEG +n06785654_15084.JPEG +n01697457_177.JPEG +n02281787_2967.JPEG +n03958227_6044.JPEG +n02825657_18956.JPEG +n02134084_1921.JPEG +n02346627_16564.JPEG +n03127925_20829.JPEG +n02165105_1120.JPEG +n07697313_2940.JPEG +n03290653_3797.JPEG +n02113799_17584.JPEG +n03594734_5227.JPEG +n01632458_2786.JPEG +n04417672_2280.JPEG +n04447861_1497.JPEG +n04367480_28152.JPEG +n02641379_34704.JPEG +n03207941_2648.JPEG +n02965783_4956.JPEG +n02687172_26156.JPEG +n03866082_13375.JPEG +n01685808_6303.JPEG +n03109150_8126.JPEG +n04286575_5278.JPEG +n03208938_6624.JPEG +n04542943_6043.JPEG +n02504458_480.JPEG +n06785654_17950.JPEG +n01818515_12559.JPEG +n09472597_21495.JPEG +n03623198_10886.JPEG +n02090721_2083.JPEG +n03131574_749.JPEG +n02892201_27941.JPEG +n04286575_35906.JPEG +n03908618_18249.JPEG +n03930630_18854.JPEG +n02808304_3892.JPEG +n03899768_40941.JPEG +n02097209_8327.JPEG +n02106030_9216.JPEG +n01877812_9780.JPEG +n03126707_5675.JPEG +n02692877_9661.JPEG +n07697537_31796.JPEG +n04228054_7853.JPEG +n02105641_8628.JPEG +n01729322_6691.JPEG +n03447721_1450.JPEG +n01697457_10634.JPEG +n04141076_34222.JPEG +n01985128_16857.JPEG +n06359193_38244.JPEG +n02101388_1907.JPEG +n03045698_2533.JPEG +n07584110_3465.JPEG +n01796340_8183.JPEG +n02091467_2074.JPEG +n01616318_2620.JPEG +n01820546_5158.JPEG +n02091635_8436.JPEG +n02492035_45371.JPEG +n04392985_7833.JPEG +n02105641_12310.JPEG +n04311174_1345.JPEG +n01756291_6536.JPEG +n03782006_1688.JPEG +n02090721_6875.JPEG +n04019541_47563.JPEG +n03792782_17469.JPEG +n02117135_1273.JPEG +n02025239_7415.JPEG +n03590841_6285.JPEG +n04033901_4693.JPEG +n01665541_8691.JPEG +n02699494_18576.JPEG +n02363005_15502.JPEG +n03680355_3583.JPEG +n02865351_28514.JPEG +n03954731_15400.JPEG +n02002556_1072.JPEG +n02114367_9837.JPEG +n01614925_4014.JPEG +n03692522_7013.JPEG +n03908618_8028.JPEG +n03916031_18737.JPEG +n02009229_2259.JPEG +n02999410_15852.JPEG +n01484850_7640.JPEG +n07836838_16571.JPEG +n03220513_7945.JPEG +n02804610_22913.JPEG +n01828970_1799.JPEG +n04118538_6073.JPEG +n03721384_102.JPEG +n01614925_30127.JPEG +n02437616_14043.JPEG +n01847000_16214.JPEG +n01530575_7964.JPEG +n07747607_5707.JPEG +n01734418_17082.JPEG +n03891251_4435.JPEG +n03680355_7995.JPEG +n02606052_5992.JPEG +n01491361_6423.JPEG +n03670208_3999.JPEG +n04120489_4884.JPEG +n03095699_27546.JPEG +n02823750_3077.JPEG +n04501370_17244.JPEG +n02110958_16426.JPEG +n02115913_3603.JPEG +n02104365_675.JPEG +n03837869_311.JPEG +n07697537_26844.JPEG +n09468604_43894.JPEG +n04389033_28264.JPEG +n04389033_50479.JPEG +n03492542_23565.JPEG +n03720891_2156.JPEG +n01955084_8839.JPEG +n02815834_10524.JPEG +n03769881_5855.JPEG +n02823428_7976.JPEG +n04417672_11240.JPEG +n02112350_1666.JPEG +n04392985_8943.JPEG +n03958227_11675.JPEG +n02134418_4672.JPEG +n04116512_17214.JPEG +n03888605_8307.JPEG +n03814639_9256.JPEG +n02342885_181.JPEG +n02102973_4648.JPEG +n02666196_11329.JPEG +n03599486_7866.JPEG +n03670208_18730.JPEG +n03131574_8164.JPEG +n03902125_2705.JPEG +n04208210_20397.JPEG +n04204347_3729.JPEG +n04153751_12584.JPEG +n04482393_25244.JPEG +n02877765_9785.JPEG +n04179913_25713.JPEG +n07711569_4737.JPEG +n02113624_6523.JPEG +n04482393_11068.JPEG +n02099849_2581.JPEG +n03933933_3764.JPEG +n02895154_28258.JPEG +n04154565_4470.JPEG +n01734418_17262.JPEG +n04192698_3002.JPEG +n02769748_24074.JPEG +n02326432_10638.JPEG +n01945685_13457.JPEG +n02037110_3450.JPEG +n02606052_17553.JPEG +n02817516_16363.JPEG +n01944390_6426.JPEG +n01632458_1172.JPEG +n02910353_5142.JPEG +n03459775_5295.JPEG +n06785654_8897.JPEG +n07768694_1096.JPEG +n03637318_6949.JPEG +n02093647_745.JPEG +n03297495_5039.JPEG +n03344393_7065.JPEG +n02977058_28076.JPEG +n02098286_1486.JPEG +n07613480_3356.JPEG +n02319095_728.JPEG +n02174001_3360.JPEG +n04204238_732.JPEG +n03372029_20144.JPEG +n03680355_1930.JPEG +n03095699_27090.JPEG +n11939491_2662.JPEG +n02280649_4156.JPEG +n02281787_3310.JPEG +n03786901_5874.JPEG +n03871628_6864.JPEG +n02132136_1405.JPEG +n04592741_12046.JPEG +n03590841_215.JPEG +n02108089_551.JPEG +n02672831_17519.JPEG +n02124075_5236.JPEG +n02165456_6027.JPEG +n02123394_4391.JPEG +n03445924_13232.JPEG +n01537544_4443.JPEG +n01735189_22347.JPEG +n02123394_578.JPEG +n01530575_10689.JPEG +n02859443_5704.JPEG +n02009912_6056.JPEG +n03874599_6013.JPEG +n03888257_36028.JPEG +n07831146_546.JPEG +n03770679_26108.JPEG +n03930313_1938.JPEG +n01770081_4018.JPEG +n03530642_51498.JPEG +n03452741_13150.JPEG +n02051845_8873.JPEG +n01753488_2973.JPEG +n04507155_8224.JPEG +n02111500_933.JPEG +n02113186_6119.JPEG +n04252225_2690.JPEG +n07920052_526.JPEG +n07749582_20707.JPEG +n01729977_13659.JPEG +n04517823_42727.JPEG +n02494079_11155.JPEG +n01496331_14886.JPEG +n02112706_4717.JPEG +n02124075_4927.JPEG +n01983481_12925.JPEG +n03447447_6066.JPEG +n04116512_11186.JPEG +n04311004_2664.JPEG +n03594945_31634.JPEG +n04465501_11252.JPEG +n02018207_9815.JPEG +n04550184_33717.JPEG +n02110341_2519.JPEG +n03868863_10845.JPEG +n02112137_15465.JPEG +n03733131_20433.JPEG +n02747177_1541.JPEG +n01751748_19693.JPEG +n03384352_6736.JPEG +n02114548_13627.JPEG +n03661043_6346.JPEG +n03933933_6175.JPEG +n02129604_1456.JPEG +n02113712_8060.JPEG +n02992211_45872.JPEG +n04525038_10587.JPEG +n03494278_27052.JPEG +n02808440_37024.JPEG +n02791270_6267.JPEG +n02894605_1648.JPEG +n03594734_1305.JPEG +n01773797_5032.JPEG +n03697007_23853.JPEG +n02443484_13308.JPEG +n01773797_482.JPEG +n04141076_52986.JPEG +n02447366_1428.JPEG +n02871525_29406.JPEG +n02484975_3605.JPEG +n03793489_6413.JPEG +n01770393_26111.JPEG +n07565083_11936.JPEG +n02264363_11522.JPEG +n07920052_16371.JPEG +n03337140_9688.JPEG +n04487394_18730.JPEG +n01773797_359.JPEG +n04344873_3912.JPEG +n02910353_30294.JPEG +n04335435_2390.JPEG +n03743016_14439.JPEG +n02102480_4591.JPEG +n07880968_1510.JPEG +n03492542_12282.JPEG +n01968897_10789.JPEG +n04483307_10885.JPEG +n02090721_4985.JPEG +n04141975_34733.JPEG +n02814860_34871.JPEG +n01530575_10229.JPEG +n13040303_3253.JPEG +n02120505_15482.JPEG +n02123159_5244.JPEG +n07749582_4439.JPEG +n02033041_2184.JPEG +n02018207_12789.JPEG +n01855032_4321.JPEG +n04263257_12207.JPEG +n02797295_3891.JPEG +n04548362_36564.JPEG +n03483316_7291.JPEG +n02398521_9942.JPEG +n03977966_9791.JPEG +n07892512_14429.JPEG +n02087394_10962.JPEG +n01494475_15443.JPEG +n03495258_1517.JPEG +n02802426_39699.JPEG +n01688243_7565.JPEG +n02168699_16451.JPEG +n04254777_2060.JPEG +n13054560_3313.JPEG +n07711569_8770.JPEG +n02860847_28685.JPEG +n02276258_4845.JPEG +n07860988_19250.JPEG +n04398044_13978.JPEG +n04204347_3657.JPEG +n04562935_47.JPEG +n04258138_14837.JPEG +n09421951_12900.JPEG +n03617480_14589.JPEG +n07754684_24900.JPEG +n02790996_12469.JPEG +n02823750_2062.JPEG +n02777292_8644.JPEG +n03207743_22454.JPEG +n02841315_24423.JPEG +n02443484_7148.JPEG +n03991062_23726.JPEG +n02106030_14013.JPEG +n02423022_7405.JPEG +n03877472_15140.JPEG +n02808440_46666.JPEG +n01855032_2117.JPEG +n02927161_16693.JPEG +n03467068_9686.JPEG +n02123394_245.JPEG +n03804744_4499.JPEG +n03825788_16005.JPEG +n04486054_12597.JPEG +n07716906_1918.JPEG +n07711569_4232.JPEG +n03065424_109380.JPEG +n03717622_9714.JPEG +n02114712_15467.JPEG +n04584207_1117.JPEG +n04004767_2200.JPEG +n04325704_1017.JPEG +n04399382_4747.JPEG +n02002556_9483.JPEG +n02018207_21287.JPEG +n07920052_23393.JPEG +n04517823_9910.JPEG +n04285008_4069.JPEG +n03372029_56653.JPEG +n02408429_2139.JPEG +n04041544_40080.JPEG +n02108089_14487.JPEG +n04111531_20493.JPEG +n02086240_1011.JPEG +n01855672_2556.JPEG +n01629819_7385.JPEG +n03888605_35702.JPEG +n02687172_97340.JPEG +n03938244_5282.JPEG +n03733805_25026.JPEG +n03980874_3884.JPEG +n03447721_8851.JPEG +n04041544_4044.JPEG +n03944341_434.JPEG +n03272562_12544.JPEG +n02981792_14844.JPEG +n02096437_5418.JPEG +n02018795_2218.JPEG +n03642806_16010.JPEG +n04081281_102266.JPEG +n03876231_39171.JPEG +n01774384_11702.JPEG +n03857828_1718.JPEG +n04118776_7158.JPEG +n04399382_756.JPEG +n01685808_5684.JPEG +n02783161_7442.JPEG +n04418357_4379.JPEG +n03017168_59002.JPEG +n02783161_9818.JPEG +n04254777_8824.JPEG +n03207941_2588.JPEG +n02017213_10576.JPEG +n10148035_970.JPEG +n07697313_2695.JPEG +n03697007_18207.JPEG +n01773157_2966.JPEG +n03709823_18432.JPEG +n09332890_3189.JPEG +n01843065_652.JPEG +n02786058_1989.JPEG +n03255030_6172.JPEG +n03724870_15647.JPEG +n02088466_12635.JPEG +n01914609_392.JPEG +n02437616_4774.JPEG +n03954731_11952.JPEG +n01514859_3235.JPEG +n02105251_8087.JPEG +n03937543_902.JPEG +n04597913_1550.JPEG +n03673027_11702.JPEG +n03657121_19980.JPEG +n02727426_4326.JPEG +n04311174_568.JPEG +n03404251_14494.JPEG +n02643566_2719.JPEG +n04049303_6846.JPEG +n03249569_34752.JPEG +n03874599_1855.JPEG +n04149813_6210.JPEG +n03935335_3136.JPEG +n01981276_14849.JPEG +n02793495_1363.JPEG +n01693334_8792.JPEG +n04557648_3316.JPEG +n03991062_1159.JPEG +n03791053_4554.JPEG +n03899768_72054.JPEG +n01697457_3869.JPEG +n04501370_11252.JPEG +n02104365_1662.JPEG +n04371430_11461.JPEG +n01773157_5639.JPEG +n01990800_8613.JPEG +n04326547_7583.JPEG +n03272010_382.JPEG +n01984695_41749.JPEG +n03933933_22031.JPEG +n03676483_7359.JPEG +n03991062_7819.JPEG +n04209239_8385.JPEG +n03891332_5531.JPEG +n04258138_1750.JPEG +n02100236_3561.JPEG +n01667778_13906.JPEG +n04201297_14172.JPEG +n02093428_10575.JPEG +n04409515_14068.JPEG +n03733805_7903.JPEG +n01978455_9967.JPEG +n03977966_48020.JPEG +n03602883_5388.JPEG +n02137549_898.JPEG +n04228054_2403.JPEG +n02025239_5070.JPEG +n04366367_6087.JPEG +n02112706_3476.JPEG +n03095699_8036.JPEG +n01739381_6985.JPEG +n03908618_8739.JPEG +n04465501_6775.JPEG +n02093256_5306.JPEG +n02086079_1591.JPEG +n02992211_16286.JPEG +n02974003_4531.JPEG +n03764736_11025.JPEG +n02787622_6466.JPEG +n02641379_2141.JPEG +n02236044_5246.JPEG +n03976467_6284.JPEG +n02835271_6147.JPEG +n02108915_10564.JPEG +n02108422_10900.JPEG +n02056570_3973.JPEG +n07753113_4373.JPEG +n04548280_14887.JPEG +n01644900_1860.JPEG +n03876231_39429.JPEG +n03976657_21085.JPEG +n02093991_4449.JPEG +n02480495_5123.JPEG +n03837869_8736.JPEG +n02109047_35222.JPEG +n03642806_18135.JPEG +n09193705_5600.JPEG +n02090379_12958.JPEG +n03884397_17168.JPEG +n04204347_1650.JPEG +n03372029_3575.JPEG +n04356056_25221.JPEG +n01855032_8521.JPEG +n02930766_24784.JPEG +n07584110_3131.JPEG +n02443114_15496.JPEG +n02869837_1257.JPEG +n02028035_5719.JPEG +n04149813_6237.JPEG +n04344873_3132.JPEG +n02086079_235.JPEG +n01978287_11925.JPEG +n04560804_5965.JPEG +n03527444_20108.JPEG +n02088466_2644.JPEG +n04355338_24878.JPEG +n03970156_6509.JPEG +n04465501_6022.JPEG +n01644373_14417.JPEG +n09193705_2937.JPEG +n03160309_34685.JPEG +n02086646_7642.JPEG +n03584829_2393.JPEG +n03876231_18575.JPEG +n01677366_8386.JPEG +n01968897_10337.JPEG +n02980441_10058.JPEG +n02120079_8597.JPEG +n04209133_3094.JPEG +n04553703_14779.JPEG +n04486054_4281.JPEG +n02326432_6837.JPEG +n02909870_38306.JPEG +n02093859_2648.JPEG +n02056570_696.JPEG +n02814533_38071.JPEG +n04380533_2507.JPEG +n02808304_7347.JPEG +n04532670_12556.JPEG +n04344873_10707.JPEG +n03344393_3422.JPEG +n01829413_6010.JPEG +n01873310_806.JPEG +n03026506_1464.JPEG +n01644373_4062.JPEG +n03781244_1622.JPEG +n03400231_712.JPEG +n03457902_37286.JPEG +n02444819_13102.JPEG +n04597913_1115.JPEG +n02113978_4695.JPEG +n04086273_15891.JPEG +n15075141_20462.JPEG +n03710637_8358.JPEG +n02979186_10211.JPEG +n03584829_41944.JPEG +n04275548_125.JPEG +n04443257_1624.JPEG +n02096051_6193.JPEG +n02488291_991.JPEG +n04147183_16633.JPEG +n02879718_1351.JPEG +n04371774_14765.JPEG +n03376595_6113.JPEG +n03976657_26396.JPEG +n04263257_7948.JPEG +n04404412_5788.JPEG +n02129604_5907.JPEG +n04370456_1997.JPEG +n03743016_5891.JPEG +n03110669_90558.JPEG +n01698640_19161.JPEG +n03721384_1866.JPEG +n01667778_4213.JPEG +n02106166_23735.JPEG +n03602883_22410.JPEG +n02093754_4943.JPEG +n03793489_974.JPEG +n07745940_6532.JPEG +n01981276_5571.JPEG +n06359193_20416.JPEG +n02102177_1322.JPEG +n01774750_7098.JPEG +n03630383_7139.JPEG +n03345487_12584.JPEG +n02870880_302.JPEG +n02815834_11170.JPEG +n02105641_1704.JPEG +n02510455_14506.JPEG +n04515003_12371.JPEG +n02107908_5408.JPEG +n02009229_589.JPEG +n01986214_10737.JPEG +n02480495_7605.JPEG +n01795545_6453.JPEG +n03992509_3819.JPEG +n03633091_21831.JPEG +n02704792_8165.JPEG +n07742313_7595.JPEG +n04456115_14390.JPEG +n02268443_10884.JPEG +n02114548_4465.JPEG +n04548280_8649.JPEG +n04263257_12058.JPEG +n01518878_2476.JPEG +n03065424_14964.JPEG +n02009912_26901.JPEG +n03141823_18279.JPEG +n02101388_20330.JPEG +n02113799_4886.JPEG +n04037443_5815.JPEG +n03630383_8272.JPEG +n09229709_7042.JPEG +n03776460_13720.JPEG +n02085620_10220.JPEG +n01629819_18608.JPEG +n04467665_69772.JPEG +n02492660_9185.JPEG +n03775071_8007.JPEG +n02027492_16960.JPEG +n03483316_5325.JPEG +n03249569_39706.JPEG +n02089867_4752.JPEG +n02113799_5749.JPEG +n03670208_7490.JPEG +n07871810_4349.JPEG +n02107574_3958.JPEG +n02094433_212.JPEG +n02105412_1106.JPEG +n04536866_25204.JPEG +n15075141_43121.JPEG +n04120489_1100.JPEG +n04560804_11406.JPEG +n03944341_9698.JPEG +n02106382_8798.JPEG +n03134739_5096.JPEG +n01872401_4363.JPEG +n03743016_15583.JPEG +n02447366_943.JPEG +n04090263_12296.JPEG +n01608432_39416.JPEG +n07860988_11515.JPEG +n03000247_9303.JPEG +n03720891_3200.JPEG +n04479046_2343.JPEG +n03777568_3537.JPEG +n01980166_7433.JPEG +n02992211_5357.JPEG +n04037443_49128.JPEG +n02437616_2384.JPEG +n02085936_10312.JPEG +n02100236_6977.JPEG +n04447861_2426.JPEG +n12768682_14290.JPEG +n02206856_3796.JPEG +n01860187_37766.JPEG +n04141327_23143.JPEG +n01774750_6389.JPEG +n01797886_1567.JPEG +n02110185_3842.JPEG +n03787032_5716.JPEG +n07745940_12130.JPEG +n09246464_20848.JPEG +n02701002_752.JPEG +n04141327_12907.JPEG +n01697457_3662.JPEG +n02091134_14780.JPEG +n02865351_3737.JPEG +n02112018_2958.JPEG +n01491361_10204.JPEG +n07734744_17908.JPEG +n01943899_8259.JPEG +n02113023_219.JPEG +n04149813_583.JPEG +n04553703_6254.JPEG +n02486410_2479.JPEG +n03649909_11648.JPEG +n04209133_3609.JPEG +n02101006_1379.JPEG +n01694178_9092.JPEG +n02112137_8534.JPEG +n04367480_13140.JPEG +n02326432_12892.JPEG +n03467068_11574.JPEG +n04069434_2770.JPEG +n02483362_5098.JPEG +n03125729_4224.JPEG +n04037443_53626.JPEG +n02607072_10685.JPEG +n02102318_13989.JPEG +n03180011_9882.JPEG +n02107683_3012.JPEG +n03000134_4247.JPEG +n03998194_9059.JPEG +n02096585_11285.JPEG +n02974003_2095.JPEG +n02099601_6989.JPEG +n04111531_348.JPEG +n02104029_7552.JPEG +n04086273_28447.JPEG +n02095570_8170.JPEG +n01742172_4260.JPEG +n02132136_24690.JPEG +n04604644_13009.JPEG +n03947888_13294.JPEG +n03759954_2788.JPEG +n02134084_24281.JPEG +n01784675_3831.JPEG +n02111500_2161.JPEG +n01692333_11180.JPEG +n04152593_2037.JPEG +n02105505_4920.JPEG +n03676483_21713.JPEG +n01667778_2262.JPEG +n01744401_6647.JPEG +n01728572_18884.JPEG +n03602883_14469.JPEG +n02018207_6941.JPEG +n02167151_7571.JPEG +n02808304_438.JPEG +n04552348_17392.JPEG +n03967562_46118.JPEG +n01531178_29584.JPEG +n04465501_3744.JPEG +n02089867_7976.JPEG +n02085936_3714.JPEG +n02007558_7768.JPEG +n03673027_39677.JPEG +n04208210_14698.JPEG +n02098286_6337.JPEG +n01630670_6073.JPEG +n01855672_5401.JPEG +n04090263_6816.JPEG +n04127249_4119.JPEG +n02992529_3694.JPEG +n02165105_2304.JPEG +n03930630_18085.JPEG +n04550184_64312.JPEG +n03961711_2390.JPEG +n02879718_7406.JPEG +n03676483_11450.JPEG +n03160309_42695.JPEG +n13037406_6642.JPEG +n01770081_9047.JPEG +n02790996_15053.JPEG +n01986214_4765.JPEG +n01682714_1432.JPEG +n02870880_15623.JPEG +n03089624_64215.JPEG +n02177972_6300.JPEG +n02037110_4549.JPEG +n02655020_17417.JPEG +n02100735_35.JPEG +n02264363_9881.JPEG +n15075141_40844.JPEG +n04285008_3447.JPEG +n02093754_4372.JPEG +n07753592_12122.JPEG +n01753488_1847.JPEG +n03444034_4617.JPEG +n01530575_3914.JPEG +n04277352_6996.JPEG +n04507155_5682.JPEG +n03016953_1890.JPEG +n01728920_1789.JPEG +n02777292_6034.JPEG +n04033901_34169.JPEG +n04560804_1258.JPEG +n02794156_6038.JPEG +n02927161_46652.JPEG +n03770679_12470.JPEG +n01735189_2098.JPEG +n03388549_4989.JPEG +n04591713_3260.JPEG +n03272010_4745.JPEG +n01739381_10223.JPEG +n04131690_7451.JPEG +n04589890_5548.JPEG +n02860847_35736.JPEG +n02090622_6968.JPEG +n07565083_9929.JPEG +n01694178_8724.JPEG +n04462240_22457.JPEG +n02105162_10841.JPEG +n04154565_10971.JPEG +n01824575_7581.JPEG +n01692333_9211.JPEG +n02325366_2080.JPEG +n02134418_3964.JPEG +n01751748_5724.JPEG +n02102318_11875.JPEG +n07590611_5480.JPEG +n04380533_1094.JPEG +n02088238_5057.JPEG +n04209133_5710.JPEG +n02101006_8088.JPEG +n03527444_17161.JPEG +n02504458_6387.JPEG +n02791270_26.JPEG +n02088632_2929.JPEG +n03534580_15676.JPEG +n02027492_10211.JPEG +n03216828_27952.JPEG +n02105412_3420.JPEG +n01498041_22641.JPEG +n03457902_25602.JPEG +n02092339_2634.JPEG +n04389033_7160.JPEG +n02037110_8567.JPEG +n03532672_28837.JPEG +n04229816_8553.JPEG +n02093256_2264.JPEG +n07768694_16104.JPEG +n03658185_19182.JPEG +n02730930_3008.JPEG +n01443537_138.JPEG +n03980874_2336.JPEG +n02099712_367.JPEG +n02128385_4404.JPEG +n03538406_1088.JPEG +n01669191_3735.JPEG +n04200800_2130.JPEG +n04554684_17594.JPEG +n03085013_2210.JPEG +n03929855_96.JPEG +n02108089_13263.JPEG +n04443257_6563.JPEG +n03447721_22597.JPEG +n04435653_6164.JPEG +n01740131_4561.JPEG +n01664065_4.JPEG +n02105505_1269.JPEG +n04505470_1367.JPEG +n04040759_1877.JPEG +n04332243_8222.JPEG +n09421951_11301.JPEG +n01742172_6411.JPEG +n02104365_1240.JPEG +n03325584_18187.JPEG +n02442845_5441.JPEG +n03649909_14410.JPEG +n13037406_4663.JPEG +n02165105_60.JPEG +n01514668_23251.JPEG +n04507155_14997.JPEG +n07248320_47663.JPEG +n02111889_8613.JPEG +n04525038_14861.JPEG +n04009552_17852.JPEG +n01698640_22888.JPEG +n03670208_33134.JPEG +n03063599_2071.JPEG +n01855672_15128.JPEG +n01514668_14532.JPEG +n12144580_10232.JPEG +n04311174_10360.JPEG +n07718472_17040.JPEG +n02860847_11955.JPEG +n02325366_4129.JPEG +n03908618_18934.JPEG +n03837869_10415.JPEG +n01614925_888.JPEG +n02403003_3952.JPEG +n04532670_17007.JPEG +n02110341_13019.JPEG +n02229544_23133.JPEG +n07745940_11584.JPEG +n04131690_3241.JPEG +n03720891_10299.JPEG +n01917289_483.JPEG +n02747177_2420.JPEG +n03297495_8311.JPEG +n04033995_23681.JPEG +n04251144_5319.JPEG +n02894605_97608.JPEG +n04286575_8721.JPEG +n01910747_616.JPEG +n03376595_10945.JPEG +n02098105_3794.JPEG +n03018349_1024.JPEG +n02843684_16435.JPEG +n02007558_1356.JPEG +n02788148_43089.JPEG +n02092339_162.JPEG +n04070727_17089.JPEG +n03595614_4695.JPEG +n02916936_6376.JPEG +n03792972_2203.JPEG +n04120489_6905.JPEG +n02486410_10555.JPEG +n02974003_1893.JPEG +n03759954_24571.JPEG +n03787032_1323.JPEG +n02093991_4712.JPEG +n03124170_833.JPEG +n02978881_9252.JPEG +n01580077_1926.JPEG +n02356798_7231.JPEG +n04067472_731.JPEG +n03344393_7233.JPEG +n02708093_6743.JPEG +n10148035_30476.JPEG +n02676566_7012.JPEG +n03954731_29620.JPEG +n04118776_55873.JPEG +n03417042_4357.JPEG +n03534580_5037.JPEG +n03400231_22655.JPEG +n02088364_7727.JPEG +n03724870_8765.JPEG +n02095314_6206.JPEG +n01843383_1934.JPEG +n03085013_3098.JPEG +n04347754_35756.JPEG +n02087394_15623.JPEG +n02364673_3663.JPEG +n04330267_7436.JPEG +n01729322_6099.JPEG +n01806567_5108.JPEG +n07583066_7987.JPEG +n02107683_7085.JPEG +n02109525_10696.JPEG +n04347754_12643.JPEG +n03794056_16034.JPEG +n01768244_3745.JPEG +n01749939_2663.JPEG +n03146219_13938.JPEG +n04179913_15345.JPEG +n03710721_20802.JPEG +n01796340_7784.JPEG +n04270147_7076.JPEG +n03899768_32319.JPEG +n02091635_13152.JPEG +n03131574_23825.JPEG +n04523525_2964.JPEG +n02096177_9032.JPEG +n04597913_3898.JPEG +n04398044_22042.JPEG +n07745940_11176.JPEG +n02791270_16362.JPEG +n01978287_4419.JPEG +n03443371_8037.JPEG +n04550184_54458.JPEG +n02910353_1440.JPEG +n02794156_5157.JPEG +n04008634_18463.JPEG +n03424325_21682.JPEG +n02408429_6068.JPEG +n03598930_11546.JPEG +n04118538_3298.JPEG +n02788148_3026.JPEG +n04039381_13243.JPEG +n03920288_7814.JPEG +n04476259_17882.JPEG +n02769748_10331.JPEG +n03018349_2493.JPEG +n04228054_2741.JPEG +n03958227_9039.JPEG +n04133789_12281.JPEG +n03417042_5235.JPEG +n04201297_6607.JPEG +n01531178_26166.JPEG +n02095314_318.JPEG +n01580077_18889.JPEG +n03325584_17290.JPEG +n01728920_8542.JPEG +n02823750_1088.JPEG +n03657121_8015.JPEG +n02782093_3757.JPEG +n01775062_4479.JPEG +n03888605_12987.JPEG +n02123159_13074.JPEG +n04467665_70988.JPEG +n01735189_8292.JPEG +n02971356_9334.JPEG +n02112350_5119.JPEG +n03837869_747.JPEG +n02091032_2681.JPEG +n02102973_1638.JPEG +n04532670_10903.JPEG +n02398521_11419.JPEG +n04243546_20013.JPEG +n01749939_7756.JPEG +n03255030_9209.JPEG +n02092339_942.JPEG +n06359193_3835.JPEG +n02105641_3275.JPEG +n02169497_12935.JPEG +n03930313_18053.JPEG +n03954731_5358.JPEG +n07871810_10257.JPEG +n02087394_7019.JPEG +n01728920_21927.JPEG +n04251144_2084.JPEG +n03673027_35072.JPEG +n09246464_47369.JPEG +n04584207_12495.JPEG +n04501370_6736.JPEG +n04152593_8252.JPEG +n01537544_9030.JPEG +n07742313_4521.JPEG +n04179913_12782.JPEG +n02457408_11221.JPEG +n04285008_1828.JPEG +n07930864_31547.JPEG +n01806567_16245.JPEG +n03899768_116883.JPEG +n04296562_20741.JPEG +n04209133_42.JPEG +n03769881_1207.JPEG +n04204347_433.JPEG +n01980166_1213.JPEG +n02094114_8593.JPEG +n02509815_8065.JPEG +n03220513_14788.JPEG +n04235860_1810.JPEG +n01871265_19404.JPEG +n04127249_9129.JPEG +n02481823_914.JPEG +n02100583_3013.JPEG +n02129604_10792.JPEG +n07932039_7220.JPEG +n02110185_9142.JPEG +n01728572_1702.JPEG +n04243546_19367.JPEG +n02280649_4665.JPEG +n02088094_899.JPEG +n03680355_5323.JPEG +n01443537_6644.JPEG +n07684084_8586.JPEG +n04589890_2882.JPEG +n02939185_698.JPEG +n02342885_388.JPEG +n03837869_5582.JPEG +n03131574_70260.JPEG +n02027492_10113.JPEG +n12768682_14036.JPEG +n03179701_372.JPEG +n02111889_5506.JPEG +n03425413_20624.JPEG +n02749479_9230.JPEG +n03692522_10899.JPEG +n01532829_1666.JPEG +n01770393_9128.JPEG +n04325704_12987.JPEG +n04252077_7556.JPEG +n07695742_7788.JPEG +n01773549_6928.JPEG +n02130308_8539.JPEG +n03691459_25149.JPEG +n01796340_1497.JPEG +n11879895_110.JPEG +n03240683_632.JPEG +n03127747_1673.JPEG +n03290653_12599.JPEG +n04116512_9866.JPEG +n02102973_2924.JPEG +n07716358_3293.JPEG +n03216828_21878.JPEG +n02088364_3833.JPEG +n02100583_1487.JPEG +n03000134_2887.JPEG +n09332890_3185.JPEG +n03595614_9154.JPEG +n03933933_16606.JPEG +n01930112_12060.JPEG +n03710193_27772.JPEG +n01955084_7146.JPEG +n04483307_10455.JPEG +n02807133_5863.JPEG +n03781244_2354.JPEG +n02219486_10607.JPEG +n02927161_27908.JPEG +n01685808_5474.JPEG +n01945685_5474.JPEG +n01819313_1090.JPEG +n03197337_10360.JPEG +n03854065_2216.JPEG +n01748264_5612.JPEG +n01773549_2417.JPEG +n02389026_2094.JPEG +n01796340_2420.JPEG +n02101556_233.JPEG +n04604644_10612.JPEG +n07693725_4324.JPEG +n02783161_23922.JPEG +n01735189_12274.JPEG +n03014705_53163.JPEG +n07836838_26241.JPEG +n01985128_30132.JPEG +n02321529_4535.JPEG +n03942813_4502.JPEG +n03942813_4157.JPEG +n02133161_499.JPEG +n02441942_22048.JPEG +n04009552_24201.JPEG +n07730033_2621.JPEG +n03877472_1465.JPEG +n04162706_20649.JPEG +n01632777_14708.JPEG +n04612504_17978.JPEG +n03065424_15587.JPEG +n01534433_2457.JPEG +n03792782_18496.JPEG +n03372029_12680.JPEG +n07742313_3356.JPEG +n02091244_12235.JPEG +n04118776_149.JPEG +n03393912_491.JPEG +n02097298_4428.JPEG +n02895154_115.JPEG +n06794110_2189.JPEG +n02699494_16937.JPEG +n01695060_5940.JPEG +n04507155_25055.JPEG +n02091467_7416.JPEG +n04517823_4015.JPEG +n01694178_3223.JPEG +n03649909_21050.JPEG +n04380533_3559.JPEG +n02109961_30822.JPEG +n02114367_11467.JPEG +n01692333_585.JPEG +n01669191_7445.JPEG +n01872401_5995.JPEG +n02640242_31361.JPEG +n02125311_25425.JPEG +n02797295_13958.JPEG +n04380533_1893.JPEG +n02231487_4241.JPEG +n01930112_14140.JPEG +n07871810_4201.JPEG +n02091032_2713.JPEG +n02883205_42837.JPEG +n02120079_10131.JPEG +n04376876_6605.JPEG +n02112350_564.JPEG +n02277742_29647.JPEG +n01665541_15451.JPEG +n03666591_31684.JPEG +n02099267_317.JPEG +n03692522_20663.JPEG +n02110806_3416.JPEG +n04456115_13709.JPEG +n02493509_5909.JPEG +n03028079_29670.JPEG +n04465501_2074.JPEG +n03388549_2905.JPEG +n04099969_18991.JPEG +n03977966_34131.JPEG +n02129604_10006.JPEG +n03710637_1213.JPEG +n02999410_4186.JPEG +n02134084_39986.JPEG +n03180011_6460.JPEG +n04371774_40.JPEG +n03929660_13641.JPEG +n02966193_28735.JPEG +n01558993_8157.JPEG +n09193705_9249.JPEG +n04612504_732.JPEG +n02088094_570.JPEG +n02607072_2824.JPEG +n02708093_1285.JPEG +n01872401_4208.JPEG +n03355925_19613.JPEG +n04404412_19162.JPEG +n02102318_1619.JPEG +n02397096_319.JPEG +n02115641_7185.JPEG +n02356798_82.JPEG +n04209133_9143.JPEG +n04146614_21073.JPEG +n07747607_15354.JPEG +n03498962_56040.JPEG +n03763968_2530.JPEG +n02361337_6337.JPEG +n01917289_973.JPEG +n03662601_23433.JPEG +n04136333_10950.JPEG +n02422106_3634.JPEG +n02100877_6589.JPEG +n02966193_32357.JPEG +n03944341_7754.JPEG +n01582220_726.JPEG +n02361337_8183.JPEG +n02268443_1306.JPEG +n02410509_1376.JPEG +n03838899_24245.JPEG +n03355925_8094.JPEG +n02106662_19360.JPEG +n03666591_13887.JPEG +n02391049_15156.JPEG +n02168699_7655.JPEG +n03196217_3362.JPEG +n02106662_8429.JPEG +n04399382_29326.JPEG +n02817516_13301.JPEG +n03991062_1993.JPEG +n02951358_33850.JPEG +n02276258_2311.JPEG +n02795169_66073.JPEG +n04127249_24701.JPEG +n01775062_1155.JPEG +n02514041_11204.JPEG +n03240683_13592.JPEG +n07718472_2565.JPEG +n02814860_65402.JPEG +n04515003_6909.JPEG +n02110958_1552.JPEG +n03803284_18612.JPEG +n04550184_8745.JPEG +n02395406_2249.JPEG +n03494278_29192.JPEG +n04204347_1204.JPEG +n03983396_9722.JPEG +n02105505_5850.JPEG +n02814533_33666.JPEG +n02437312_12716.JPEG +n03868863_15665.JPEG +n04532106_15273.JPEG +n01622779_3482.JPEG +n02319095_10133.JPEG +n02112350_3505.JPEG +n03733131_9174.JPEG +n04613696_14731.JPEG +n15075141_24407.JPEG +n04442312_13836.JPEG +n04548362_15107.JPEG +n02395406_18819.JPEG +n03976657_20788.JPEG +n03445777_1971.JPEG +n04476259_15994.JPEG +n02980441_15020.JPEG +n02087046_6610.JPEG +n04238763_7184.JPEG +n01664065_19576.JPEG +n02749479_26684.JPEG +n06874185_1894.JPEG +n02106030_1452.JPEG +n03065424_57657.JPEG +n13133613_17080.JPEG +n03494278_413.JPEG +n03970156_13310.JPEG +n02120079_22626.JPEG +n04201297_10910.JPEG +n03133878_10239.JPEG +n04536866_6518.JPEG +n02105251_3386.JPEG +n03724870_12253.JPEG +n03967562_46681.JPEG +n01616318_208.JPEG +n04376876_17556.JPEG +n02087046_4506.JPEG +n09332890_9872.JPEG +n02877765_12155.JPEG +n02364673_819.JPEG +n03958227_11343.JPEG +n02408429_18252.JPEG +n02988304_12586.JPEG +n02129165_18622.JPEG +n01491361_6192.JPEG +n04286575_1300.JPEG +n02443114_9431.JPEG +n03868242_91.JPEG +n02268853_315.JPEG +n02326432_44403.JPEG +n02107574_5774.JPEG +n03424325_2664.JPEG +n04389033_46585.JPEG +n02640242_621.JPEG +n03930630_19305.JPEG +n02493793_4948.JPEG +n07715103_12111.JPEG +n04254120_2991.JPEG +n04147183_17479.JPEG +n04442312_4688.JPEG +n04192698_39573.JPEG +n02423022_3459.JPEG +n02095889_5857.JPEG +n02879718_30817.JPEG +n03075370_6426.JPEG +n03259280_6147.JPEG +n04367480_19012.JPEG +n02483708_9074.JPEG +n03594734_52138.JPEG +n09468604_40305.JPEG +n02058221_9436.JPEG +n02099429_3568.JPEG +n13133613_10908.JPEG +n10565667_13986.JPEG +n04162706_34456.JPEG +n03649909_10168.JPEG +n02963159_1484.JPEG +n04505470_3782.JPEG +n02437312_116.JPEG +n01697457_8839.JPEG +n04049303_7483.JPEG +n04604644_10020.JPEG +n01818515_1615.JPEG +n04483307_4066.JPEG +n03000684_33902.JPEG +n04141327_7459.JPEG +n02939185_33584.JPEG +n01910747_19803.JPEG +n01986214_595.JPEG +n03680355_20921.JPEG +n03240683_6485.JPEG +n03709823_18421.JPEG +n02892767_15970.JPEG +n03825788_20443.JPEG +n02100236_5331.JPEG +n03958227_2809.JPEG +n03457902_11259.JPEG +n02823750_1784.JPEG +n02859443_37847.JPEG +n07579787_3276.JPEG +n03026506_6743.JPEG +n03995372_1004.JPEG +n02443484_6709.JPEG +n03743016_13808.JPEG +n03133878_7598.JPEG +n04604644_18696.JPEG +n02115641_3862.JPEG +n01496331_24503.JPEG +n04347754_14967.JPEG +n03445924_14021.JPEG +n02134418_5418.JPEG +n02356798_5516.JPEG +n03355925_7332.JPEG +n03691459_41450.JPEG +n07718747_14657.JPEG +n02134418_788.JPEG +n02100583_5115.JPEG +n02808440_45532.JPEG +n04456115_1035.JPEG +n03759954_11319.JPEG +n03482405_32864.JPEG +n09246464_39759.JPEG +n02108551_22155.JPEG +n03929855_3133.JPEG +n02363005_44721.JPEG +n04286575_14923.JPEG +n03929660_4115.JPEG +n04456115_16334.JPEG +n03998194_1707.JPEG +n03450230_1049.JPEG +n04487081_7817.JPEG +n03759954_21277.JPEG +n04099969_4644.JPEG +n04542943_8311.JPEG +n03720891_10569.JPEG +n02277742_3640.JPEG +n04487081_21362.JPEG +n02787622_994.JPEG +n03492542_14908.JPEG +n04125021_14779.JPEG +n04554684_10258.JPEG +n04562935_8491.JPEG +n02110185_8190.JPEG +n01871265_281.JPEG +n02747177_2391.JPEG +n03372029_24039.JPEG +n01631663_20439.JPEG +n02939185_8622.JPEG +n03729826_654.JPEG +n02172182_3688.JPEG +n01775062_8257.JPEG +n03992509_3576.JPEG +n03347037_4291.JPEG +n01985128_17106.JPEG +n02256656_4790.JPEG +n01755581_11287.JPEG +n02259212_3717.JPEG +n02814533_2782.JPEG +n02009912_12547.JPEG +n01748264_15296.JPEG +n02978881_11050.JPEG +n03063599_4228.JPEG +n03141823_3966.JPEG +n02102177_2891.JPEG +n04141076_4981.JPEG +n04487081_12780.JPEG +n07753275_15186.JPEG +n02134418_5704.JPEG +n02730930_15111.JPEG +n03018349_20463.JPEG +n01734418_1850.JPEG +n07831146_5555.JPEG +n03623198_278.JPEG +n06794110_1108.JPEG +n03991062_3031.JPEG +n04069434_6697.JPEG +n03690938_3744.JPEG +n04479046_12241.JPEG +n03794056_12982.JPEG +n07716906_11087.JPEG +n01776313_21491.JPEG +n02018207_12063.JPEG +n02085936_2154.JPEG +n02817516_45783.JPEG +n02226429_11866.JPEG +n02992529_27823.JPEG +n07880968_5266.JPEG +n02791270_21327.JPEG +n02088238_8073.JPEG +n02412080_12171.JPEG +n02105162_2664.JPEG +n03785016_14333.JPEG +n03127747_5005.JPEG +n02106166_7163.JPEG +n04153751_2848.JPEG +n02096294_836.JPEG +n02509815_14983.JPEG +n03042490_13374.JPEG +n01806567_977.JPEG +n01910747_1161.JPEG +n04074963_6771.JPEG +n02115641_8506.JPEG +n04596742_28757.JPEG +n04296562_14474.JPEG +n01871265_6458.JPEG +n01773157_6511.JPEG +n02395406_72601.JPEG +n04332243_10222.JPEG +n02484975_818.JPEG +n03297495_4644.JPEG +n07584110_12008.JPEG +n07614500_83672.JPEG +n02363005_12310.JPEG +n02085782_1156.JPEG +n02389026_246.JPEG +n03782006_8300.JPEG +n02105412_8074.JPEG +n04370456_2333.JPEG +n01774384_21359.JPEG +n04136333_2213.JPEG +n04458633_4728.JPEG +n04612504_40487.JPEG +n04479046_4199.JPEG +n07749582_15772.JPEG +n02111129_6484.JPEG +n13054560_7392.JPEG +n01981276_18544.JPEG +n01608432_6837.JPEG +n03297495_2399.JPEG +n07248320_94811.JPEG +n03255030_3393.JPEG +n03814906_13011.JPEG +n04065272_27321.JPEG +n04599235_11707.JPEG +n03496892_16676.JPEG +n02074367_1697.JPEG +n02107142_5570.JPEG +n04590129_848.JPEG +n02138441_2247.JPEG +n04263257_8029.JPEG +n03743016_1737.JPEG +n07715103_439.JPEG +n01756291_12424.JPEG +n02132136_2043.JPEG +n04273569_338.JPEG +n03127925_539.JPEG +n03393912_1549.JPEG +n02808304_8725.JPEG +n04376876_19210.JPEG +n02087046_7423.JPEG +n03720891_16127.JPEG +n02088632_3737.JPEG +n07873807_10626.JPEG +n02090622_9960.JPEG +n03594945_5628.JPEG +n03017168_62071.JPEG +n02445715_34834.JPEG +n03529860_6835.JPEG +n04099969_5000.JPEG +n01580077_197.JPEG +n03662601_10341.JPEG +n01532829_615.JPEG +n02169497_3266.JPEG +n02823750_9590.JPEG +n03840681_8293.JPEG +n03938244_8431.JPEG +n04252077_5168.JPEG +n03944341_10059.JPEG +n02128925_17176.JPEG +n04398044_4635.JPEG +n03220513_15150.JPEG +n02410509_3831.JPEG +n02086240_3128.JPEG +n03933933_78615.JPEG +n01749939_7356.JPEG +n01749939_1305.JPEG +n02096437_7621.JPEG +n02795169_1818.JPEG +n03384352_17381.JPEG +n02113624_2902.JPEG +n03759954_25520.JPEG +n07932039_9519.JPEG +n02814860_5951.JPEG +n04127249_4635.JPEG +n03775071_20756.JPEG +n04254680_8256.JPEG +n03617480_8458.JPEG +n03630383_1907.JPEG +n03544143_12477.JPEG +n02111889_2146.JPEG +n03775071_4136.JPEG +n02486261_8562.JPEG +n02094258_741.JPEG +n02092339_7617.JPEG +n02939185_37197.JPEG +n03976657_7949.JPEG +n04254120_782.JPEG +n03690938_407.JPEG +n03792782_3759.JPEG +n02086646_946.JPEG +n01440764_8045.JPEG +n01729322_11513.JPEG +n04532670_10046.JPEG +n02445715_42319.JPEG +n03594734_17053.JPEG +n02085620_1471.JPEG +n04479046_12556.JPEG +n03146219_26389.JPEG +n02346627_10570.JPEG +n03220513_7920.JPEG +n12998815_223.JPEG +n01910747_8094.JPEG +n03459775_15219.JPEG +n03742115_9964.JPEG +n02101388_17219.JPEG +n01534433_14484.JPEG +n03207941_18497.JPEG +n03884397_23162.JPEG +n03794056_22016.JPEG +n02363005_2079.JPEG +n03902125_21468.JPEG +n01514668_4819.JPEG +n07718747_3818.JPEG +n04310018_6616.JPEG +n03063689_4903.JPEG +n09332890_27260.JPEG +n01631663_8394.JPEG +n03804744_3803.JPEG +n02951358_14419.JPEG +n02769748_2261.JPEG +n01748264_8526.JPEG +n02978881_10602.JPEG +n03220513_14408.JPEG +n04462240_13770.JPEG +n03337140_58410.JPEG +n03041632_13655.JPEG +n02417914_9916.JPEG +n06785654_2246.JPEG +n09229709_5578.JPEG +n03127747_11990.JPEG +n02422106_6154.JPEG +n02114855_6008.JPEG +n04347754_1901.JPEG +n07930864_34949.JPEG +n03000684_16066.JPEG +n02087046_5847.JPEG +n02097474_13659.JPEG +n02058221_7642.JPEG +n02233338_7695.JPEG +n01824575_4563.JPEG +n02977058_22526.JPEG +n03916031_3177.JPEG +n03770679_10463.JPEG +n02107574_988.JPEG +n02787622_5818.JPEG +n03476684_2220.JPEG +n04417672_4637.JPEG +n02859443_24869.JPEG +n01981276_8983.JPEG +n03388183_3988.JPEG +n07754684_35125.JPEG +n02825657_3308.JPEG +n07730033_3280.JPEG +n02892767_14298.JPEG +n03956157_13803.JPEG +n03697007_1042.JPEG +n01980166_7856.JPEG +n01631663_8041.JPEG +n02233338_12275.JPEG +n04509417_2019.JPEG +n02883205_15295.JPEG +n07565083_3370.JPEG +n02123394_467.JPEG +n04371774_11577.JPEG +n01774384_13646.JPEG +n03742115_8689.JPEG +n02099601_825.JPEG +n02006656_7178.JPEG +n01945685_2173.JPEG +n02317335_1877.JPEG +n03384352_4437.JPEG +n03649909_6164.JPEG +n03908714_11146.JPEG +n02916936_4418.JPEG +n02403003_13181.JPEG +n02033041_5441.JPEG +n02092339_3361.JPEG +n07614500_44304.JPEG +n04336792_1125.JPEG +n03710721_15203.JPEG +n04476259_6194.JPEG +n01950731_8614.JPEG +n01820546_4285.JPEG +n01950731_8421.JPEG +n03770679_19436.JPEG +n02107683_3086.JPEG +n02009912_1807.JPEG +n01582220_10794.JPEG +n04127249_3671.JPEG +n02356798_4843.JPEG +n03942813_5918.JPEG +n02423022_4596.JPEG +n07711569_4499.JPEG +n02510455_141.JPEG +n07754684_12343.JPEG +n01675722_4068.JPEG +n03602883_261.JPEG +n03976467_2486.JPEG +n02002724_17419.JPEG +n02123597_12964.JPEG +n02123394_7018.JPEG +n01770393_16371.JPEG +n01735189_3069.JPEG +n02169497_1358.JPEG +n02417914_8463.JPEG +n02101006_1808.JPEG +n01930112_13266.JPEG +n03146219_8543.JPEG +n02509815_12103.JPEG +n04273569_8743.JPEG +n09835506_14477.JPEG +n03379051_41.JPEG +n04136333_7893.JPEG +n02116738_806.JPEG +n03445924_24941.JPEG +n03187595_10923.JPEG +n13040303_3752.JPEG +n02643566_1943.JPEG +n02795169_70828.JPEG +n02791124_4579.JPEG +n01871265_5890.JPEG +n03775546_20856.JPEG +n04336792_3547.JPEG +n04367480_26040.JPEG +n02948072_4688.JPEG +n02930766_1854.JPEG +n04423845_30478.JPEG +n01689811_5182.JPEG +n02840245_9198.JPEG +n03888257_6453.JPEG +n04536866_10474.JPEG +n03891332_4044.JPEG +n02280649_9843.JPEG +n01580077_6317.JPEG +n04228054_1281.JPEG +n03777754_14418.JPEG +n03063599_4177.JPEG +n01820546_1636.JPEG +n01632777_15170.JPEG +n03710721_21390.JPEG +n04596742_7947.JPEG +n02093647_3558.JPEG +n02490219_5018.JPEG +n03131574_59682.JPEG +n02981792_22617.JPEG +n03495258_7638.JPEG +n07745940_12069.JPEG +n13052670_4322.JPEG +n04141327_8643.JPEG +n02105412_6759.JPEG +n03482405_28431.JPEG +n01675722_8634.JPEG +n02346627_7809.JPEG +n01592084_7544.JPEG +n03773504_4432.JPEG +n04099969_2146.JPEG +n01756291_5758.JPEG +n02172182_2752.JPEG +n03627232_1765.JPEG +n02443114_1756.JPEG +n01665541_5745.JPEG +n02051845_8547.JPEG +n03527444_24383.JPEG +n02783161_24867.JPEG +n02417914_43543.JPEG +n02843684_1852.JPEG +n02687172_38723.JPEG +n03393912_16039.JPEG +n03467068_15192.JPEG +n03188531_160.JPEG +n11939491_24864.JPEG +n03776460_21070.JPEG +n02093991_2984.JPEG +n02692877_10332.JPEG +n07714990_14079.JPEG +n04208210_7303.JPEG +n02094433_6247.JPEG +n02965783_5102.JPEG +n02667093_7511.JPEG +n03884397_15252.JPEG +n02102177_1312.JPEG +n02814533_38775.JPEG +n04026417_27605.JPEG +n01682714_5373.JPEG +n02066245_24189.JPEG +n02423022_8737.JPEG +n02804610_1140.JPEG +n02487347_3659.JPEG +n02111889_227.JPEG +n07730033_1386.JPEG +n03657121_13105.JPEG +n02087394_16610.JPEG +n04273569_6306.JPEG +n04447861_568.JPEG +n01985128_29320.JPEG +n03538406_1818.JPEG +n02860847_26999.JPEG +n01968897_24068.JPEG +n01985128_39994.JPEG +n02256656_15586.JPEG +n03259280_2.JPEG +n04428191_1405.JPEG +n01740131_2045.JPEG +n02002724_6337.JPEG +n04147183_29093.JPEG +n03788195_17202.JPEG +n04515003_16952.JPEG +n04371774_32312.JPEG +n03291819_4343.JPEG +n03903868_35629.JPEG +n02114367_12828.JPEG +n03259280_5885.JPEG +n04482393_26306.JPEG +n02489166_4719.JPEG +n02033041_5279.JPEG +n07717556_1477.JPEG +n03794056_20793.JPEG +n01631663_14233.JPEG +n02687172_51645.JPEG +n02096585_2081.JPEG +n03924679_7382.JPEG +n12144580_7553.JPEG +n02356798_5279.JPEG +n01924916_6806.JPEG +n07753275_24945.JPEG +n02089078_8642.JPEG +n01531178_2494.JPEG +n02096051_2151.JPEG +n02356798_1565.JPEG +n03916031_11453.JPEG +n04435653_9846.JPEG +n02110627_8815.JPEG +n04409515_20698.JPEG +n02104365_3679.JPEG +n02106382_2600.JPEG +n03775546_4137.JPEG +n02097130_1332.JPEG +n02488291_1246.JPEG +n02108915_653.JPEG +n02106030_11998.JPEG +n02979186_9688.JPEG +n04522168_8901.JPEG +n04389033_5307.JPEG +n02092002_1924.JPEG +n04258138_16878.JPEG +n04592741_303.JPEG +n04591713_7561.JPEG +n07873807_5462.JPEG +n02090622_1469.JPEG +n01734418_6.JPEG +n03404251_14324.JPEG +n02480855_1013.JPEG +n02814533_66056.JPEG +n02123597_5884.JPEG +n07932039_22274.JPEG +n02089867_2735.JPEG +n03187595_2951.JPEG +n02666196_16112.JPEG +n01983481_12495.JPEG +n01847000_12986.JPEG +n02391049_13310.JPEG +n03544143_12912.JPEG +n02704792_3830.JPEG +n04141975_42531.JPEG +n04265275_2924.JPEG +n07565083_28346.JPEG +n04612504_582.JPEG +n02493509_16850.JPEG +n04409515_811.JPEG +n02120505_1445.JPEG +n02114367_16534.JPEG +n03146219_4648.JPEG +n02110063_12344.JPEG +n03388549_6509.JPEG +n02979186_20898.JPEG +n01986214_6594.JPEG +n04606251_4090.JPEG +n03445777_2133.JPEG +n04008634_25018.JPEG +n02672831_43262.JPEG +n03498962_9386.JPEG +n01514668_13268.JPEG +n02361337_24033.JPEG +n02109047_26931.JPEG +n07880968_2494.JPEG +n01580077_17412.JPEG +n13133613_22809.JPEG +n02966687_3965.JPEG +n02397096_2700.JPEG +n07716358_15279.JPEG +n02965783_3443.JPEG +n01494475_17008.JPEG +n02100735_7830.JPEG +n04265275_6969.JPEG +n03291819_4516.JPEG +n02074367_17295.JPEG +n02104029_5216.JPEG +n03388043_4428.JPEG +n06359193_37779.JPEG +n02106166_1244.JPEG +n02364673_3980.JPEG +n02165456_2367.JPEG +n04560804_13232.JPEG +n03976657_36814.JPEG +n02442845_22430.JPEG +n11879895_7800.JPEG +n02086646_6783.JPEG +n02321529_1772.JPEG +n02749479_1024.JPEG +n07920052_9336.JPEG +n04336792_15233.JPEG +n03255030_10704.JPEG +n02939185_23187.JPEG +n02487347_399.JPEG +n04201297_5434.JPEG +n03786901_1905.JPEG +n03207941_436.JPEG +n02410509_8173.JPEG +n07714990_8773.JPEG +n01616318_10085.JPEG +n03544143_527.JPEG +n03196217_5598.JPEG +n07745940_13054.JPEG +n02087394_36.JPEG +n02099601_152.JPEG +n03777568_13481.JPEG +n04398044_21474.JPEG +n03938244_27851.JPEG +n01756291_1318.JPEG +n03837869_7199.JPEG +n02091134_17467.JPEG +n03218198_453.JPEG +n03961711_16027.JPEG +n02514041_2816.JPEG +n03764736_5666.JPEG +n04355933_2150.JPEG +n04041544_26899.JPEG +n03124170_12133.JPEG +n07695742_11717.JPEG +n03804744_19388.JPEG +n02510455_78404.JPEG +n04041544_11898.JPEG +n02096177_8317.JPEG +n02441942_3225.JPEG +n02085936_1739.JPEG +n04447861_2437.JPEG +n03930630_17351.JPEG +n03495258_26322.JPEG +n03404251_20263.JPEG +n02749479_7200.JPEG +n04332243_10502.JPEG +n03599486_8482.JPEG +n04090263_211.JPEG +n02808440_82146.JPEG +n02088094_5952.JPEG +n02487347_15434.JPEG +n04584207_8281.JPEG +n03680355_2281.JPEG +n03492542_207.JPEG +n02012849_10338.JPEG +n03658185_35815.JPEG +n03459775_13043.JPEG +n04254777_5318.JPEG +n02788148_4100.JPEG +n04592741_17916.JPEG +n02444819_1486.JPEG +n04606251_2036.JPEG +n03045698_16894.JPEG +n01644900_21890.JPEG +n01855672_15400.JPEG +n02389026_5739.JPEG +n03394916_49516.JPEG +n01978287_6178.JPEG +n02110958_6912.JPEG +n01798484_12695.JPEG +n03657121_14026.JPEG +n02398521_29689.JPEG +n02107908_10978.JPEG +n03478589_561.JPEG +n03924679_12532.JPEG +n04462240_2467.JPEG +n02454379_8238.JPEG +n07716906_1130.JPEG +n02096051_876.JPEG +n01537544_700.JPEG +n02834397_1027.JPEG +n02074367_4529.JPEG +n02012849_6668.JPEG +n06794110_6757.JPEG +n04243546_27085.JPEG +n04523525_37452.JPEG +n07753113_29904.JPEG +n02808440_2884.JPEG +n04311174_2217.JPEG +n04548362_17951.JPEG +n04376876_9836.JPEG +n03417042_29849.JPEG +n03141823_5722.JPEG +n04380533_1130.JPEG +n01770081_9817.JPEG +n04065272_23153.JPEG +n01770081_16552.JPEG +n01910747_1823.JPEG +n02105162_4634.JPEG +n03000247_38023.JPEG +n02950826_11265.JPEG +n02132136_22761.JPEG +n02268443_1766.JPEG +n01560419_6965.JPEG +n02094433_728.JPEG +n02364673_391.JPEG +n02865351_12967.JPEG +n01531178_15203.JPEG +n03141823_1936.JPEG +n02445715_17475.JPEG +n02111277_2446.JPEG +n07584110_4820.JPEG +n03047690_26218.JPEG +n02096437_3928.JPEG +n02835271_69.JPEG +n04141076_36104.JPEG +n03498962_15351.JPEG +n02398521_23231.JPEG +n02790996_18356.JPEG +n02114712_21764.JPEG +n01773157_10423.JPEG +n03938244_32230.JPEG +n03982430_16514.JPEG +n02978881_4158.JPEG +n02408429_12364.JPEG +n01882714_4800.JPEG +n03207743_12580.JPEG +n02096294_6422.JPEG +n01532829_5982.JPEG +n03944341_6630.JPEG +n01950731_14575.JPEG +n03534580_10724.JPEG +n02494079_10244.JPEG +n02102973_6446.JPEG +n03787032_2807.JPEG +n04228054_3395.JPEG +n04591713_5295.JPEG +n02138441_842.JPEG +n06359193_70011.JPEG +n04049303_8876.JPEG +n02108000_3296.JPEG +n02095570_11661.JPEG +n02096585_12899.JPEG +n03417042_13651.JPEG +n03843555_7390.JPEG +n02097047_1351.JPEG +n02415577_9702.JPEG +n03000247_35728.JPEG +n03220513_15460.JPEG +n03481172_21125.JPEG +n02086910_1388.JPEG +n03924679_7669.JPEG +n03891251_1918.JPEG +n02011460_3908.JPEG +n04264628_20487.JPEG +n03617480_2193.JPEG +n07693725_4055.JPEG +n02457408_218.JPEG +n03584254_6100.JPEG +n02687172_30968.JPEG +n01756291_2968.JPEG +n03085013_6963.JPEG +n02119789_2429.JPEG +n04136333_349.JPEG +n03840681_16046.JPEG +n01806143_12038.JPEG +n02319095_3238.JPEG +n04579432_36637.JPEG +n01774384_3945.JPEG +n02692877_12997.JPEG +n02094114_925.JPEG +n03062245_4834.JPEG +n11939491_18879.JPEG +n02085620_9008.JPEG +n02091134_8891.JPEG +n02190166_9420.JPEG +n02115641_11064.JPEG +n04033995_48032.JPEG +n04004767_10350.JPEG +n01494475_6331.JPEG +n03584829_33916.JPEG +n02787622_9671.JPEG +n02028035_2291.JPEG +n02256656_2060.JPEG +n03372029_17140.JPEG +n03792972_9028.JPEG +n03930313_13127.JPEG +n02643566_3290.JPEG +n02727426_39437.JPEG +n01728920_15498.JPEG +n02113712_18836.JPEG +n01877812_1173.JPEG +n01817953_1491.JPEG +n03127747_3957.JPEG +n01756291_17208.JPEG +n03874293_11109.JPEG +n07693725_7581.JPEG +n02138441_2024.JPEG +n03595614_33906.JPEG +n04330267_8826.JPEG +n06874185_532.JPEG +n02787622_25580.JPEG +n03447721_11304.JPEG +n01644373_8469.JPEG +n07873807_3981.JPEG +n04584207_18091.JPEG +n03196217_6393.JPEG +n02236044_3069.JPEG +n01632777_17467.JPEG +n03344393_4871.JPEG +n03630383_1307.JPEG +n03692522_4232.JPEG +n02802426_22336.JPEG +n01491361_7151.JPEG +n02783161_41276.JPEG +n02504013_405.JPEG +n02794156_21139.JPEG +n04548362_488.JPEG +n01843383_2631.JPEG +n02174001_4130.JPEG +n04467665_857.JPEG +n07584110_10811.JPEG +n04049303_3911.JPEG +n13037406_2665.JPEG +n03967562_11658.JPEG +n03188531_36670.JPEG +n02091134_8193.JPEG +n04004767_1674.JPEG +n02441942_18888.JPEG +n02869837_13451.JPEG +n03995372_8549.JPEG +n01693334_282.JPEG +n03404251_14481.JPEG +n02536864_10562.JPEG +n07615774_8484.JPEG +n04357314_3904.JPEG +n02114855_30325.JPEG +n02012849_4763.JPEG +n02489166_855.JPEG +n03417042_17684.JPEG +n02500267_15429.JPEG +n02093754_115.JPEG +n02088094_2947.JPEG +n07614500_16717.JPEG +n02087394_2969.JPEG +n01695060_42258.JPEG +n03207941_4447.JPEG +n02033041_6565.JPEG +n03000684_16431.JPEG +n03457902_39963.JPEG +n04372370_30699.JPEG +n02077923_5680.JPEG +n01614925_300.JPEG +n02259212_5667.JPEG +n03014705_15136.JPEG +n02488291_4112.JPEG +n03000684_32916.JPEG +n01784675_9176.JPEG +n02099429_3047.JPEG +n04111531_452.JPEG +n01818515_7364.JPEG +n04116512_21002.JPEG +n01484850_18541.JPEG +n03450230_10617.JPEG +n04277352_4699.JPEG +n02123045_119.JPEG +n04399382_26941.JPEG +n02128925_18175.JPEG +n03000134_254.JPEG +n03459775_3143.JPEG +n03877472_38605.JPEG +n07760859_5392.JPEG +n03220513_32076.JPEG +n04310018_9854.JPEG +n03710193_12256.JPEG +n02396427_7777.JPEG +n02259212_28.JPEG +n02096051_9419.JPEG +n03476684_872.JPEG +n03902125_8532.JPEG +n03792782_11297.JPEG +n04111531_6474.JPEG +n04599235_534.JPEG +n03355925_18533.JPEG +n02109961_21790.JPEG +n02099849_3127.JPEG +n02280649_3513.JPEG +n03662601_10144.JPEG +n03000134_2871.JPEG +n01968897_7568.JPEG +n02025239_646.JPEG +n02112018_504.JPEG +n02106662_61574.JPEG +n02138441_3589.JPEG +n03218198_6881.JPEG +n03627232_1952.JPEG +n04209239_8326.JPEG +n02087046_4780.JPEG +n02437312_5076.JPEG +n04591713_7104.JPEG +n03763968_5627.JPEG +n02120505_3301.JPEG +n02536864_8317.JPEG +n03908618_15938.JPEG +n04265275_13340.JPEG +n01945685_12966.JPEG +n02895154_13076.JPEG +n02782093_20611.JPEG +n03452741_13757.JPEG +n01768244_8853.JPEG +n02317335_6150.JPEG +n10148035_20036.JPEG +n03476684_3041.JPEG +n10148035_13907.JPEG +n03250847_3422.JPEG +n03924679_9094.JPEG +n02408429_3020.JPEG +n02782093_1042.JPEG +n03770679_16354.JPEG +n04254680_2098.JPEG +n01491361_5401.JPEG +n12267677_7957.JPEG +n02948072_8470.JPEG +n03197337_1903.JPEG +n02123597_4942.JPEG +n02916936_2803.JPEG +n01641577_9434.JPEG +n04355338_8123.JPEG +n07892512_8235.JPEG +n02486410_2177.JPEG +n02699494_14583.JPEG +n02484975_1998.JPEG +n02607072_6442.JPEG +n04330267_6557.JPEG +n04285008_17149.JPEG +n03876231_1881.JPEG +n07695742_11197.JPEG +n04404412_36285.JPEG +n04355338_12109.JPEG +n03794056_26929.JPEG +n02113712_7058.JPEG +n02776631_12616.JPEG +n04371774_1548.JPEG +n04086273_13792.JPEG +n02096051_1177.JPEG +n03393912_10405.JPEG +n03814906_42713.JPEG +n03657121_13758.JPEG +n02109525_10146.JPEG +n03127747_3917.JPEG +n01644900_3494.JPEG +n03208938_12966.JPEG +n07747607_175.JPEG +n02992211_27571.JPEG +n04141327_7668.JPEG +n02808304_19212.JPEG +n01740131_10289.JPEG +n01984695_37000.JPEG +n02095889_1451.JPEG +n02105251_1430.JPEG +n02493509_11908.JPEG +n02480495_27031.JPEG +n04310018_9874.JPEG +n03995372_3498.JPEG +n02823428_3469.JPEG +n02120505_10346.JPEG +n04296562_18090.JPEG +n02033041_12998.JPEG +n01828970_7665.JPEG +n02091244_1397.JPEG +n02093647_2001.JPEG +n02086240_6871.JPEG +n01775062_1378.JPEG +n04417672_8258.JPEG +n03770439_9211.JPEG +n04542943_1575.JPEG +n02727426_24423.JPEG +n03775546_12828.JPEG +n01795545_18300.JPEG +n01784675_1175.JPEG +n04476259_46753.JPEG +n03666591_29667.JPEG +n04517823_2534.JPEG +n03047690_23220.JPEG +n03947888_36198.JPEG +n02107574_2191.JPEG +n04023962_14624.JPEG +n02112018_1816.JPEG +n02011460_7370.JPEG +n02939185_15734.JPEG +n02444819_13233.JPEG +n02643566_1110.JPEG +n01496331_17864.JPEG +n02108915_2228.JPEG +n04505470_4974.JPEG +n02091831_7681.JPEG +n02097298_10892.JPEG +n03796401_2027.JPEG +n02536864_15943.JPEG +n02797295_3882.JPEG +n02444819_1508.JPEG +n04275548_6409.JPEG +n01774384_10533.JPEG +n01744401_10133.JPEG +n04201297_7450.JPEG +n01641577_20505.JPEG +n03127747_11524.JPEG +n03393912_3358.JPEG +n01917289_4692.JPEG +n03207941_12358.JPEG +n04251144_12329.JPEG +n02037110_22638.JPEG +n04590129_20897.JPEG +n03792782_1398.JPEG +n03633091_17735.JPEG +n02412080_6371.JPEG +n04560804_24458.JPEG +n03388043_9803.JPEG +n01768244_4745.JPEG +n01728572_5659.JPEG +n09472597_18911.JPEG +n03045698_5715.JPEG +n02483708_268.JPEG +n03630383_275.JPEG +n03775071_2021.JPEG +n02100583_24401.JPEG +n03642806_30556.JPEG +n03100240_21884.JPEG +n02497673_307.JPEG +n02480495_6153.JPEG +n13052670_5883.JPEG +n02487347_12712.JPEG +n01644900_3190.JPEG +n07831146_5623.JPEG +n03100240_4149.JPEG +n02640242_62.JPEG +n02317335_16055.JPEG +n02106030_6620.JPEG +n03950228_28251.JPEG +n02894605_27189.JPEG +n07760859_4004.JPEG +n02410509_1890.JPEG +n03777568_1202.JPEG +n02091134_7373.JPEG +n02165456_16447.JPEG +n02119789_13069.JPEG +n02114855_1897.JPEG +n02992529_17325.JPEG +n02328150_8631.JPEG +n04040759_13164.JPEG +n02666196_13221.JPEG +n03895866_72025.JPEG +n03944341_23572.JPEG +n03838899_14082.JPEG +n02361337_16295.JPEG +n04467665_12032.JPEG +n03532672_24049.JPEG +n03124170_3902.JPEG +n03930630_19425.JPEG +n03590841_3279.JPEG +n02109047_20859.JPEG +n04153751_15196.JPEG +n01582220_3156.JPEG +n01986214_463.JPEG +n01770393_27264.JPEG +n02002724_13192.JPEG +n02807133_17042.JPEG +n02978881_1815.JPEG +n03467068_12566.JPEG +n04597913_5286.JPEG +n01630670_8177.JPEG +n03857828_7159.JPEG +n04591713_856.JPEG +n02480855_9675.JPEG +n07717410_2877.JPEG +n03775546_12087.JPEG +n03062245_15157.JPEG +n03840681_18200.JPEG +n04070727_6374.JPEG +n02101388_7114.JPEG +n04428191_7639.JPEG +n02788148_5053.JPEG +n03876231_6055.JPEG +n02950826_30657.JPEG +n02097474_6397.JPEG +n02120079_2805.JPEG +n03775071_1635.JPEG +n01774750_11492.JPEG +n01914609_1297.JPEG +n01498041_3799.JPEG +n02342885_12559.JPEG +n04548280_3458.JPEG +n12620546_19099.JPEG +n01828970_5961.JPEG +n02011460_2222.JPEG +n03075370_2766.JPEG +n03706229_4276.JPEG +n02504013_2778.JPEG +n04049303_761.JPEG +n02444819_6003.JPEG +n01824575_9567.JPEG +n01629819_19343.JPEG +n09332890_18314.JPEG +n02113712_587.JPEG +n02791270_4380.JPEG +n03443371_3781.JPEG +n03450230_11110.JPEG +n09193705_1984.JPEG +n04505470_3171.JPEG +n01622779_4043.JPEG +n13044778_3904.JPEG +n02123394_7206.JPEG +n03825788_16632.JPEG +n07802026_13661.JPEG +n02109525_18601.JPEG +n02123159_7270.JPEG +n04254777_8361.JPEG +n02085782_64.JPEG +n02088238_1372.JPEG +n02123597_6258.JPEG +n02123159_12425.JPEG +n01644373_15598.JPEG +n03903868_27605.JPEG +n03584254_3004.JPEG +n01530575_10193.JPEG +n01616318_8681.JPEG +n03062245_1329.JPEG +n03447447_3221.JPEG +n04039381_11022.JPEG +n04357314_11656.JPEG +n02825657_1637.JPEG +n03814639_4747.JPEG +n02097130_1617.JPEG +n01740131_4080.JPEG +n06785654_12019.JPEG +n04532670_481.JPEG +n02492660_1762.JPEG +n06359193_8578.JPEG +n03345487_17360.JPEG +n03776460_13696.JPEG +n03250847_11049.JPEG +n04041544_15070.JPEG +n04550184_63237.JPEG +n02786058_6955.JPEG +n07753275_883.JPEG +n01950731_12524.JPEG +n02277742_28664.JPEG +n01871265_1029.JPEG +n04357314_5927.JPEG +n02690373_10114.JPEG +n02123045_11561.JPEG +n02086646_2445.JPEG +n03314780_3397.JPEG +n02817516_67495.JPEG +n01665541_19405.JPEG +n04350905_2472.JPEG +n01774384_6501.JPEG +n02988304_8974.JPEG +n03017168_41291.JPEG +n04443257_27499.JPEG +n02114367_298.JPEG +n02669723_7676.JPEG +n02672831_52465.JPEG +n02974003_9802.JPEG +n03133878_2788.JPEG +n04258138_1162.JPEG +n01496331_28709.JPEG +n01737021_12404.JPEG +n03207743_6442.JPEG +n01981276_21008.JPEG +n01798484_14483.JPEG +n02971356_17581.JPEG +n04204238_1322.JPEG +n01770081_527.JPEG +n03481172_7904.JPEG +n02641379_25470.JPEG +n12998815_15910.JPEG +n02701002_18641.JPEG +n01694178_138.JPEG +n02909870_40765.JPEG +n01924916_1310.JPEG +n03476991_38145.JPEG +n03535780_17341.JPEG +n02992529_23245.JPEG +n02037110_4861.JPEG +n02099601_4005.JPEG +n02488291_2405.JPEG +n01689811_12646.JPEG +n04228054_7880.JPEG +n02279972_12816.JPEG +n02799071_13844.JPEG +n06874185_2732.JPEG +n01774384_17357.JPEG +n04589890_9958.JPEG +n02124075_8985.JPEG +n04589890_2305.JPEG +n12267677_3090.JPEG +n04238763_1534.JPEG +n03838899_39539.JPEG +n04208210_41671.JPEG +n02086646_7486.JPEG +n02128757_6309.JPEG +n01773157_5356.JPEG +n03888605_13507.JPEG +n02395406_17850.JPEG +n03141823_8498.JPEG +n13040303_1794.JPEG +n04008634_24913.JPEG +n01734418_4105.JPEG +n01688243_10273.JPEG +n07802026_16402.JPEG +n01843065_4436.JPEG +n03485407_3418.JPEG +n04125021_2434.JPEG +n03062245_4725.JPEG +n03891251_1903.JPEG +n01675722_5817.JPEG +n01614925_16436.JPEG +n02097130_12700.JPEG +n03218198_2492.JPEG +n02092002_7753.JPEG +n02115913_9923.JPEG +n07615774_11557.JPEG +n02133161_11506.JPEG +n01819313_3098.JPEG +n04355933_5106.JPEG +n03803284_4219.JPEG +n02415577_7501.JPEG +n02110627_3893.JPEG +n04592741_76362.JPEG +n02978881_11992.JPEG +n09288635_2889.JPEG +n04501370_3689.JPEG +n03710193_12777.JPEG +n03014705_39986.JPEG +n02099712_5407.JPEG +n03908714_3674.JPEG +n07860988_30483.JPEG +n03404251_1093.JPEG +n04033901_6513.JPEG +n01797886_10396.JPEG +n02108915_3326.JPEG +n04458633_5267.JPEG +n04141327_5786.JPEG +n01532829_5160.JPEG +n04254777_2387.JPEG +n07920052_10684.JPEG +n03347037_12715.JPEG +n02102973_4469.JPEG +n02493509_23138.JPEG +n04147183_3901.JPEG +n03089624_15715.JPEG +n02006656_9940.JPEG +n02100236_440.JPEG +n07248320_103362.JPEG +n02481823_1384.JPEG +n01491361_222.JPEG +n03110669_14570.JPEG +n09428293_66811.JPEG +n03492542_16992.JPEG +n04208210_37961.JPEG +n02797295_194.JPEG +n02346627_9889.JPEG +n03467068_2041.JPEG +n03786901_8453.JPEG +n04209133_734.JPEG +n07613480_38100.JPEG +n04040759_12038.JPEG +n02105056_6022.JPEG +n02112137_9040.JPEG +n04330267_8052.JPEG +n03947888_34553.JPEG +n02870880_10038.JPEG +n02112018_9925.JPEG +n02110958_15779.JPEG +n02110063_16017.JPEG +n02443484_6635.JPEG +n03777754_32677.JPEG +n04461696_6500.JPEG +n03891332_3664.JPEG +n03804744_21081.JPEG +n02107683_5447.JPEG +n04252225_15456.JPEG +n03840681_18361.JPEG +n03443371_5274.JPEG +n02116738_36928.JPEG +n07747607_13630.JPEG +n01924916_5181.JPEG +n02027492_1213.JPEG +n04070727_29429.JPEG +n04251144_16558.JPEG +n02097130_2416.JPEG +n01943899_12717.JPEG +n02105162_8612.JPEG +n03259280_10142.JPEG +n03642806_28207.JPEG +n04344873_5451.JPEG +n03776460_21604.JPEG +n04023962_27806.JPEG +n02504013_698.JPEG +n02865351_32878.JPEG +n03617480_6377.JPEG +n02231487_5654.JPEG +n03445924_33.JPEG +n03388183_18927.JPEG +n02233338_13614.JPEG +n02971356_17553.JPEG +n03690938_20747.JPEG +n03770679_2462.JPEG +n07590611_2871.JPEG +n03452741_7870.JPEG +n03976657_14194.JPEG +n03961711_3106.JPEG +n02134084_6168.JPEG +n02051845_30838.JPEG +n03344393_5351.JPEG +n04372370_15465.JPEG +n07871810_4323.JPEG +n07754684_6141.JPEG +n01843065_1088.JPEG +n02422106_1922.JPEG +n01774750_1024.JPEG +n01532829_3270.JPEG +n02027492_10084.JPEG +n04251144_20867.JPEG +n03658185_18229.JPEG +n04118538_5787.JPEG +n02951585_30232.JPEG +n04376876_10693.JPEG +n02165456_14409.JPEG +n03444034_8684.JPEG +n04592741_16907.JPEG +n02877765_16773.JPEG +n03388043_15870.JPEG +n04273569_32786.JPEG +n02909870_47032.JPEG +n03207941_19177.JPEG +n03706229_457.JPEG +n09288635_1300.JPEG +n04372370_29313.JPEG +n02105251_5091.JPEG +n02105641_11190.JPEG +n03590841_13177.JPEG +n09468604_57366.JPEG +n02077923_666.JPEG +n09332890_28778.JPEG +n03729826_10111.JPEG +n02089078_3681.JPEG +n02129604_21402.JPEG +n03478589_10819.JPEG +n02236044_6821.JPEG +n04487394_21088.JPEG +n03425413_14554.JPEG +n03134739_6701.JPEG +n01534433_24231.JPEG +n03706229_9911.JPEG +n04347754_72802.JPEG +n03793489_9803.JPEG +n07734744_3578.JPEG +n02093256_3479.JPEG +n03710637_6442.JPEG +n02116738_2547.JPEG +n04442312_34254.JPEG +n03017168_34928.JPEG +n02114712_17164.JPEG +n03825788_3663.JPEG +n03272010_11538.JPEG +n13054560_1379.JPEG +n03404251_15038.JPEG +n04536866_11911.JPEG +n02110958_7579.JPEG +n04423845_50145.JPEG +n01775062_1282.JPEG +n02840245_11545.JPEG +n02815834_2877.JPEG +n03706229_5992.JPEG +n10565667_1122.JPEG +n03461385_27503.JPEG +n04332243_20686.JPEG +n02094258_2758.JPEG +n02099712_4784.JPEG +n02091467_5724.JPEG +n03197337_1585.JPEG +n02536864_3350.JPEG +n01632458_5346.JPEG +n02108089_13300.JPEG +n02096051_8706.JPEG +n02012849_6867.JPEG +n02794156_12323.JPEG +n03127925_10956.JPEG +n03775071_11805.JPEG +n07716906_10311.JPEG +n02526121_29515.JPEG +n02787622_3172.JPEG +n04579432_32656.JPEG +n03933933_13649.JPEG +n03908714_2946.JPEG +n02281406_12424.JPEG +n03179701_1381.JPEG +n07715103_16817.JPEG +n04429376_9176.JPEG +n02840245_22.JPEG +n03496892_16877.JPEG +n03832673_13262.JPEG +n01910747_4974.JPEG +n04370456_8183.JPEG +n04371430_4659.JPEG +n07715103_9803.JPEG +n01773549_8361.JPEG +n01677366_1849.JPEG +n03095699_26728.JPEG +n02091635_3901.JPEG +n03110669_32483.JPEG +n04487081_10853.JPEG +n02391049_5189.JPEG +n04392985_18921.JPEG +n04067472_10587.JPEG +n01632458_1470.JPEG +n02423022_7427.JPEG +n02101006_5350.JPEG +n01847000_9357.JPEG +n03538406_989.JPEG +n02807133_4309.JPEG +n02835271_6186.JPEG +n04589890_4124.JPEG +n02883205_7789.JPEG +n03180011_10105.JPEG +n04265275_5995.JPEG +n02843684_24634.JPEG +n02807133_3639.JPEG +n03775546_8605.JPEG +n04486054_12408.JPEG +n02112137_4358.JPEG +n07684084_1758.JPEG +n01877812_9054.JPEG +n01630670_8449.JPEG +n02328150_17903.JPEG +n09193705_3162.JPEG +n02011460_2938.JPEG +n04229816_2305.JPEG +n02536864_10081.JPEG +n02092002_1957.JPEG +n04357314_5318.JPEG +n04074963_21112.JPEG +n03347037_30665.JPEG +n07697537_26402.JPEG +n04116512_213.JPEG +n03388549_1129.JPEG +n03763968_2610.JPEG +n02105056_4407.JPEG +n03666591_23594.JPEG +n02489166_11994.JPEG +n03796401_19153.JPEG +n03691459_43102.JPEG +n03733281_7083.JPEG +n04033995_5212.JPEG +n02113186_8787.JPEG +n03379051_4271.JPEG +n02870880_11173.JPEG +n02167151_7472.JPEG +n03793489_7737.JPEG +n02317335_2962.JPEG +n02116738_5910.JPEG +n03763968_13762.JPEG +n02859443_2241.JPEG +n02606052_4661.JPEG +n02326432_26003.JPEG +n02099601_3601.JPEG +n04604644_18992.JPEG +n04252077_1294.JPEG +n04147183_21589.JPEG +n02672831_1433.JPEG +n02128925_31776.JPEG +n04235860_18367.JPEG +n02120505_2449.JPEG +n01693334_11141.JPEG +n02790996_7437.JPEG +n02356798_3593.JPEG +n03642806_8078.JPEG +n03854065_6495.JPEG +n01824575_8184.JPEG +n03255030_6678.JPEG +n02802426_13238.JPEG +n03187595_7806.JPEG +n07590611_5523.JPEG +n02110806_373.JPEG +n02114855_19007.JPEG +n02281406_5912.JPEG +n07747607_11710.JPEG +n04146614_9472.JPEG +n15075141_379.JPEG +n02128925_12.JPEG +n04179913_8702.JPEG +n01806143_13953.JPEG +n03837869_3219.JPEG +n04146614_18262.JPEG +n01687978_310.JPEG +n03770439_12593.JPEG +n02102318_9191.JPEG +n02454379_7828.JPEG +n01990800_7095.JPEG +n02869837_573.JPEG +n02823428_3298.JPEG +n03220513_16355.JPEG +n04141975_9934.JPEG +n02106662_23175.JPEG +n02096585_1717.JPEG +n03832673_16416.JPEG +n01675722_3589.JPEG +n02100735_3600.JPEG +n07697313_6653.JPEG +n03485407_5362.JPEG +n02454379_2066.JPEG +n02111500_8843.JPEG +n03394916_23333.JPEG +n02091831_13223.JPEG +n03126707_16058.JPEG +n01820546_6046.JPEG +n02085620_12790.JPEG +n04259630_21095.JPEG +n09835506_1915.JPEG +n03692522_606.JPEG +n02110627_8856.JPEG +n04265275_2519.JPEG +n02099849_3040.JPEG +n03085013_4180.JPEG +n02268853_1698.JPEG +n02128757_10598.JPEG +n04118776_47499.JPEG +n01667114_15733.JPEG +n03899768_36894.JPEG +n02791270_333.JPEG +n03874293_1622.JPEG +n03630383_2057.JPEG +n02979186_5498.JPEG +n02119022_8941.JPEG +n01755581_22344.JPEG +n01608432_11780.JPEG +n07880968_2789.JPEG +n02963159_2285.JPEG +n03457902_2604.JPEG +n04009552_8151.JPEG +n04310018_14378.JPEG +n07875152_666.JPEG +n02097047_6058.JPEG +n03496892_20759.JPEG +n02093859_4931.JPEG +n03874599_7564.JPEG +n03743016_4542.JPEG +n02105162_5562.JPEG +n02018795_6875.JPEG +n02526121_346.JPEG +n06596364_1509.JPEG +n02699494_9561.JPEG +n02113023_6618.JPEG +n02095570_10631.JPEG +n04265275_6392.JPEG +n02105056_4101.JPEG +n02786058_16568.JPEG +n04259630_13035.JPEG +n02643566_1126.JPEG +n01860187_14363.JPEG +n07714990_1572.JPEG +n13040303_2286.JPEG +n13040303_8321.JPEG +n02808440_42561.JPEG +n01950731_8713.JPEG +n02114367_8604.JPEG +n01695060_45592.JPEG +n04597913_4085.JPEG +n03100240_14792.JPEG +n02835271_8925.JPEG +n04070727_31055.JPEG +n02177972_14974.JPEG +n15075141_19715.JPEG +n02708093_3086.JPEG +n03742115_16622.JPEG +n04493381_17383.JPEG +n02094433_13881.JPEG +n01855672_6371.JPEG +n03976467_8324.JPEG +n03908714_7164.JPEG +n03976657_62014.JPEG +n07695742_1488.JPEG +n07714571_4626.JPEG +n03325584_2144.JPEG +n04266014_11437.JPEG +n02113186_6287.JPEG +n12144580_49178.JPEG +n02441942_21518.JPEG +n02966193_6019.JPEG +n04033901_14663.JPEG +n02102318_10389.JPEG +n03075370_58.JPEG +n02099601_3273.JPEG +n01739381_7536.JPEG +n02999410_1904.JPEG +n03180011_807.JPEG +n03452741_4394.JPEG +n03532672_30031.JPEG +n01795545_6914.JPEG +n03877472_1946.JPEG +n02776631_7729.JPEG +n02033041_9237.JPEG +n12267677_87.JPEG +n01484850_18862.JPEG +n02018795_16887.JPEG +n02977058_4689.JPEG +n01986214_3379.JPEG +n02699494_5836.JPEG +n07768694_3348.JPEG +n02011460_8294.JPEG +n02280649_3635.JPEG +n03584254_2420.JPEG +n02102480_6129.JPEG +n03384352_4208.JPEG +n04204238_5661.JPEG +n02906734_9991.JPEG +n02009229_8250.JPEG +n03782006_3403.JPEG +n02640242_995.JPEG +n01983481_1281.JPEG +n02747177_24503.JPEG +n02096051_9422.JPEG +n02100877_5964.JPEG +n02799071_7167.JPEG +n01984695_65010.JPEG +n01682714_21800.JPEG +n02817516_15245.JPEG +n03657121_8978.JPEG +n02110185_10314.JPEG +n04265275_1911.JPEG +n02089078_5915.JPEG +n02869837_1459.JPEG +n01917289_3927.JPEG +n02017213_8443.JPEG +n04371774_13691.JPEG +n04033901_4594.JPEG +n11939491_48922.JPEG +n04509417_11210.JPEG +n01740131_22025.JPEG +n02095889_1051.JPEG +n12998815_12318.JPEG +n03884397_5045.JPEG +n03447721_7798.JPEG +n01514668_10576.JPEG +n02177972_12323.JPEG +n02342885_8212.JPEG +n02676566_183.JPEG +n04443257_853.JPEG +n03000247_28906.JPEG +n02093256_3229.JPEG +n03983396_10161.JPEG +n04435653_5696.JPEG +n02795169_7116.JPEG +n03983396_1792.JPEG +n09835506_2826.JPEG +n04428191_532.JPEG +n02493793_2481.JPEG +n04501370_19125.JPEG +n04599235_3861.JPEG +n02966193_39928.JPEG +n03110669_40492.JPEG +n02655020_9467.JPEG +n04311174_1326.JPEG +n01734418_727.JPEG +n02119789_4903.JPEG +n02107142_43626.JPEG +n02089973_1346.JPEG +n03791053_2707.JPEG +n01644900_15317.JPEG +n03777568_5568.JPEG +n03666591_69869.JPEG +n03924679_12843.JPEG +n03425413_14325.JPEG +n12998815_3667.JPEG +n02487347_12803.JPEG +n03032252_54873.JPEG +n03485794_9173.JPEG +n04550184_59831.JPEG +n02088364_3551.JPEG +n03532672_32226.JPEG +n07753113_36421.JPEG +n02837789_19296.JPEG +n02098413_8674.JPEG +n03796401_5323.JPEG +n04127249_3802.JPEG +n02776631_6440.JPEG +n02086646_1952.JPEG +n04136333_15139.JPEG +n01632458_1117.JPEG +n04336792_11410.JPEG +n12998815_190.JPEG +n03929855_3556.JPEG +n03888605_14519.JPEG +n04350905_27463.JPEG +n03773504_56.JPEG +n03786901_1512.JPEG +n04613696_877.JPEG +n02130308_5026.JPEG +n02093428_12481.JPEG +n03529860_20307.JPEG +n03271574_7564.JPEG +n02007558_7920.JPEG +n12057211_6299.JPEG +n01877812_6228.JPEG +n04554684_3183.JPEG +n03208938_3913.JPEG +n02097474_9653.JPEG +n01833805_9517.JPEG +n04483307_11847.JPEG +n02087394_18126.JPEG +n01768244_8744.JPEG +n03841143_3207.JPEG +n02481823_14601.JPEG +n03445777_13186.JPEG +n04423845_21783.JPEG +n09246464_87785.JPEG +n04141076_3.JPEG +n02910353_15727.JPEG +n02011460_309.JPEG +n01631663_815.JPEG +n02100236_1845.JPEG +n02802426_1175.JPEG +n04275548_12140.JPEG +n02101556_7827.JPEG +n03803284_25301.JPEG +n01877812_5179.JPEG +n03496892_9875.JPEG +n01694178_7569.JPEG +n02317335_4564.JPEG +n03690938_3817.JPEG +n02669723_15379.JPEG +n01496331_3635.JPEG +n01685808_7688.JPEG +n04423845_6970.JPEG +n04201297_2796.JPEG +n02098105_710.JPEG +n03532672_28723.JPEG +n01818515_2052.JPEG +n04228054_301.JPEG +n01498041_6226.JPEG +n03495258_2760.JPEG +n03791053_11548.JPEG +n04404412_21159.JPEG +n09246464_10533.JPEG +n07831146_363.JPEG +n04086273_11209.JPEG +n01806567_9604.JPEG +n07831146_3356.JPEG +n04019541_15867.JPEG +n01775062_5393.JPEG +n04131690_5751.JPEG +n02098413_7358.JPEG +n07715103_8272.JPEG +n03485794_589.JPEG +n03000247_62542.JPEG +n04044716_3628.JPEG +n03710637_13861.JPEG +n02102318_3434.JPEG +n12267677_25299.JPEG +n04392985_2512.JPEG +n02110806_8857.JPEG +n01697457_130.JPEG +n07711569_2700.JPEG +n03871628_15055.JPEG +n02226429_231.JPEG +n04584207_9832.JPEG +n02488702_5262.JPEG +n02514041_6569.JPEG +n04389033_4459.JPEG +n02231487_3957.JPEG +n03791053_21258.JPEG +n07871810_4854.JPEG +n03445924_4871.JPEG +n02483362_7249.JPEG +n01734418_13478.JPEG +n02391049_2524.JPEG +n01784675_10222.JPEG +n02480855_2298.JPEG +n07717556_196.JPEG +n03134739_4592.JPEG +n04509417_3101.JPEG +n03857828_28083.JPEG +n04152593_23273.JPEG +n02110806_3703.JPEG +n03776460_1365.JPEG +n03450230_8792.JPEG +n02129165_14157.JPEG +n01860187_9139.JPEG +n04074963_19748.JPEG +n01968897_22497.JPEG +n01944390_11554.JPEG +n02092002_3971.JPEG +n03141823_2057.JPEG +n04005630_1528.JPEG +n02090622_339.JPEG +n04599235_67.JPEG +n04209133_10332.JPEG +n07583066_6477.JPEG +n03793489_6927.JPEG +n03788365_2776.JPEG +n07753275_19241.JPEG +n02002724_2371.JPEG +n01443537_860.JPEG +n07871810_5823.JPEG +n02837789_23269.JPEG +n03594945_27034.JPEG +n02088364_5753.JPEG +n13054560_5269.JPEG +n03026506_4091.JPEG +n04325704_12382.JPEG +n01685808_4523.JPEG +n03201208_4590.JPEG +n03481172_16650.JPEG +n02058221_7961.JPEG +n07697313_15882.JPEG +n03998194_9143.JPEG +n06874185_21034.JPEG +n02443114_2456.JPEG +n02804610_13627.JPEG +n02363005_27635.JPEG +n01744401_5762.JPEG +n02104365_3161.JPEG +n03876231_3617.JPEG +n03920288_1490.JPEG +n02412080_16618.JPEG +n02090379_8203.JPEG +n04254680_9929.JPEG +n03868863_7198.JPEG +n03759954_20016.JPEG +n03498962_58217.JPEG +n04347754_317.JPEG +n02422699_13305.JPEG +n03188531_27843.JPEG +n03866082_8025.JPEG +n02795169_3230.JPEG +n02109961_4451.JPEG +n02097047_4473.JPEG +n01768244_1635.JPEG +n01983481_22963.JPEG +n03868863_12220.JPEG +n04326547_8256.JPEG +n07734744_5655.JPEG +n02457408_15457.JPEG +n01644900_7534.JPEG +n02843684_15346.JPEG +n02277742_410.JPEG +n02389026_19225.JPEG +n04023962_6111.JPEG +n04311174_4471.JPEG +n02096585_6595.JPEG +n12267677_36329.JPEG +n01698640_6062.JPEG +n02095889_1120.JPEG +n03691459_44017.JPEG +n02488291_532.JPEG +n04335435_571.JPEG +n04005630_45764.JPEG +n02692877_9639.JPEG +n02500267_989.JPEG +n03595614_10856.JPEG +n04069434_5775.JPEG +n04399382_12710.JPEG +n04590129_6015.JPEG +n02124075_10346.JPEG +n02493793_2131.JPEG +n01751748_6863.JPEG +n04081281_31396.JPEG +n03404251_10183.JPEG +n03345487_15620.JPEG +n02098413_1313.JPEG +n03216828_6007.JPEG +n03337140_35392.JPEG +n02098413_1794.JPEG +n03840681_1731.JPEG +n02279972_23931.JPEG +n04536866_10155.JPEG +n03717622_12931.JPEG +n03733131_164.JPEG +n04141327_7774.JPEG +n01978455_2093.JPEG +n02951585_9049.JPEG +n03424325_20932.JPEG +n13040303_4924.JPEG +n03792972_97.JPEG +n03443371_2420.JPEG +n02094433_583.JPEG +n03481172_30099.JPEG +n02802426_4028.JPEG +n02457408_4021.JPEG +n02536864_1846.JPEG +n01829413_1912.JPEG +n02114712_1595.JPEG +n03485407_3836.JPEG +n03216828_1855.JPEG +n01774384_1710.JPEG +n04332243_16451.JPEG +n02119022_10503.JPEG +n02098413_2797.JPEG +n03950228_24539.JPEG +n02107908_3791.JPEG +n02092339_1237.JPEG +n02606052_9151.JPEG +n03100240_23623.JPEG +n02006656_10695.JPEG +n01984695_21792.JPEG +n02105505_1731.JPEG +n02356798_1236.JPEG +n01728572_9503.JPEG +n04335435_10933.JPEG +n02910353_12164.JPEG +n01693334_21383.JPEG +n03838899_28244.JPEG +n02123394_1703.JPEG +n04525305_11014.JPEG +n02167151_4402.JPEG +n02107312_3166.JPEG +n02091467_4140.JPEG +n04597913_293.JPEG +n03160309_46045.JPEG +n04317175_6719.JPEG +n03761084_13067.JPEG +n02091635_2305.JPEG +n03787032_2185.JPEG +n02786058_18236.JPEG +n02105505_5289.JPEG +n01945685_13506.JPEG +n03534580_21016.JPEG +n04277352_6593.JPEG +n03461385_38477.JPEG +n03047690_57321.JPEG +n01855032_2371.JPEG +n03814639_1994.JPEG +n03721384_6637.JPEG +n02095570_3963.JPEG +n03544143_7468.JPEG +n01817953_9346.JPEG +n04591713_4783.JPEG +n04356056_16949.JPEG +n04033995_13532.JPEG +n07753275_8011.JPEG +n07718747_23977.JPEG +n02655020_2270.JPEG +n02106550_6253.JPEG +n03207743_2442.JPEG +n04423845_742.JPEG +n02229544_1581.JPEG +n02113186_772.JPEG +n03761084_3758.JPEG +n01735189_11490.JPEG +n03814906_60372.JPEG +n07745940_2427.JPEG +n03761084_19412.JPEG +n02869837_15099.JPEG +n02113023_8382.JPEG +n03134739_6950.JPEG +n02445715_1683.JPEG +n12267677_325.JPEG +n02124075_10085.JPEG +n03692522_7012.JPEG +n04243546_16387.JPEG +n04086273_2207.JPEG +n03874293_4958.JPEG +n02978881_1684.JPEG +n07747607_18254.JPEG +n02480855_663.JPEG +n02169497_4429.JPEG +n03527444_5933.JPEG +n02799071_1268.JPEG +n02086079_3493.JPEG +n02107908_8502.JPEG +n02018795_1659.JPEG +n02492660_9199.JPEG +n01872401_12447.JPEG +n02110958_12819.JPEG +n01751748_6435.JPEG +n02364673_757.JPEG +n04336792_15692.JPEG +n03000134_2037.JPEG +n02093428_19443.JPEG +n02325366_3957.JPEG +n13054560_4122.JPEG +n04482393_21654.JPEG +n03527444_9645.JPEG +n04596742_3284.JPEG +n04125021_23609.JPEG +n02119789_9177.JPEG +n04596742_2700.JPEG +n03599486_17404.JPEG +n07873807_7031.JPEG +n02087394_29790.JPEG +n02841315_19948.JPEG +n02692877_2075.JPEG +n03792972_6693.JPEG +n04476259_14687.JPEG +n04606251_11363.JPEG +n02808440_37716.JPEG +n04125021_25083.JPEG +n04532106_11044.JPEG +n02871525_15585.JPEG +n02094258_1137.JPEG +n04532106_11821.JPEG +n01692333_4398.JPEG +n04493381_22634.JPEG +n04146614_10189.JPEG +n04311004_1183.JPEG +n02097047_4497.JPEG +n02133161_2038.JPEG +n03188531_6434.JPEG +n02113023_11627.JPEG +n04418357_2997.JPEG +n09428293_39607.JPEG +n01950731_3829.JPEG +n02119022_6754.JPEG +n07720875_16072.JPEG +n01984695_13288.JPEG +n03982430_10137.JPEG +n03461385_29077.JPEG +n04086273_30587.JPEG +n03781244_18340.JPEG +n03461385_6987.JPEG +n01530575_37935.JPEG +n01855672_9072.JPEG +n03786901_14674.JPEG +n03443371_2258.JPEG +n06874185_24908.JPEG +n13037406_6167.JPEG +n02107683_723.JPEG +n01558993_15175.JPEG +n02814533_42481.JPEG +n02447366_30597.JPEG +n02974003_4389.JPEG +n03218198_20008.JPEG +n03447447_2854.JPEG +n13052670_6739.JPEG +n07711569_5473.JPEG +n03956157_2795.JPEG +n03961711_16161.JPEG +n01797886_10895.JPEG +n02110341_3375.JPEG +n01614925_29988.JPEG +n04523525_10714.JPEG +n02102177_81.JPEG +n02115641_7082.JPEG +n03670208_9732.JPEG +n04238763_10200.JPEG +n03666591_34279.JPEG +n07615774_21655.JPEG +n03950228_14959.JPEG +n02481823_1527.JPEG +n02085620_5711.JPEG +n03218198_13704.JPEG +n03773504_12956.JPEG +n04550184_31039.JPEG +n03980874_1094.JPEG +n02799071_22619.JPEG +n03492542_55558.JPEG +n02786058_4173.JPEG +n03956157_14181.JPEG +n03127925_10478.JPEG +n04357314_13971.JPEG +n04204347_9539.JPEG +n03240683_14273.JPEG +n02493509_512.JPEG +n03590841_11236.JPEG +n03796401_7518.JPEG +n02699494_4055.JPEG +n02099267_11489.JPEG +n03929660_4523.JPEG +n01491361_5665.JPEG +n04509417_5016.JPEG +n02088466_4889.JPEG +n07932039_7362.JPEG +n02111129_5814.JPEG +n03208938_11742.JPEG +n02776631_53736.JPEG +n01872401_5924.JPEG +n04074963_13710.JPEG +n02777292_17693.JPEG +n04131690_8135.JPEG +n02094433_1203.JPEG +n02102177_5864.JPEG +n02113023_10825.JPEG +n04131690_20948.JPEG +n01630670_6214.JPEG +n02174001_1920.JPEG +n02094114_7688.JPEG +n03249569_13258.JPEG +n02422699_8152.JPEG +n02917067_13619.JPEG +n03775546_13572.JPEG +n01694178_6853.JPEG +n07720875_7656.JPEG +n03908618_8370.JPEG +n02417914_13339.JPEG +n02504458_5235.JPEG +n02906734_570.JPEG +n02791270_21894.JPEG +n02843684_2492.JPEG +n03599486_19026.JPEG +n04522168_2774.JPEG +n02110806_2349.JPEG +n07892512_41930.JPEG +n02950826_19130.JPEG +n04536866_19755.JPEG +n04479046_10303.JPEG +n03297495_5359.JPEG +n04258138_6108.JPEG +n03197337_550.JPEG +n02102177_1208.JPEG +n02127052_15865.JPEG +n02095570_10478.JPEG +n02509815_218.JPEG +n02028035_1254.JPEG +n02992211_12858.JPEG +n04461696_20559.JPEG +n01930112_19049.JPEG +n02088466_8631.JPEG +n01978287_974.JPEG +n01768244_2573.JPEG +n03272562_20180.JPEG +n04090263_23438.JPEG +n07871810_27233.JPEG +n02086240_6237.JPEG +n01773157_121.JPEG +n04238763_11813.JPEG +n03459775_8010.JPEG +n02108089_2458.JPEG +n13054560_335.JPEG +n01737021_16047.JPEG +n01773797_148.JPEG +n04311004_1307.JPEG +n02137549_1218.JPEG +n02133161_8197.JPEG +n03026506_792.JPEG +n03788195_38256.JPEG +n02091032_4039.JPEG +n04456115_29005.JPEG +n07714571_16070.JPEG +n02483708_7200.JPEG +n02979186_17986.JPEG +n03623198_8253.JPEG +n02769748_31730.JPEG +n03724870_11453.JPEG +n04429376_15058.JPEG +n01978455_4941.JPEG +n11939491_24319.JPEG +n09256479_1999.JPEG +n02098286_2894.JPEG +n02165456_7058.JPEG +n04149813_452.JPEG +n03127747_6651.JPEG +n01882714_14067.JPEG +n07718472_23212.JPEG +n04404412_5714.JPEG +n01697457_7002.JPEG +n02115913_1311.JPEG +n02085936_7865.JPEG +n03272562_3241.JPEG +n02892767_27396.JPEG +n01773157_1578.JPEG +n02091032_2569.JPEG +n02134084_7288.JPEG +n01630670_5469.JPEG +n02112706_3521.JPEG +n07753592_6184.JPEG +n01692333_402.JPEG +n02906734_1741.JPEG +n02093256_718.JPEG +n07613480_17109.JPEG +n03781244_26213.JPEG +n04149813_24505.JPEG +n03930313_22415.JPEG +n04147183_9488.JPEG +n02783161_2730.JPEG +n03223299_252.JPEG +n04330267_28707.JPEG +n02134084_24179.JPEG +n02981792_214.JPEG +n07717410_7828.JPEG +n02840245_10385.JPEG +n07565083_656.JPEG +n02011460_4041.JPEG +n02085620_9480.JPEG +n02088632_4976.JPEG +n02264363_3727.JPEG +n04162706_9978.JPEG +n01910747_4942.JPEG +n02100583_21205.JPEG +n01641577_14528.JPEG +n03063689_15318.JPEG +n03710193_5737.JPEG +n07718472_38076.JPEG +n04270147_12477.JPEG +n03014705_41993.JPEG +n01860187_19047.JPEG +n04435653_2002.JPEG +n01986214_721.JPEG +n02107142_35536.JPEG +n02172182_164.JPEG +n04357314_8171.JPEG +n03180011_9315.JPEG +n04404412_39197.JPEG +n02105412_5118.JPEG +n01984695_50200.JPEG +n02666196_4016.JPEG +n02129165_9417.JPEG +n02013706_8630.JPEG +n04229816_193.JPEG +n09835506_23309.JPEG +n02509815_1981.JPEG +n04398044_5665.JPEG +n02066245_7297.JPEG +n01753488_4798.JPEG +n10565667_1264.JPEG +n03658185_1751.JPEG +n04009552_27236.JPEG +n02105505_802.JPEG +n02097130_1030.JPEG +n02086079_4984.JPEG +n01806143_3195.JPEG +n02999410_6939.JPEG +n03788365_12243.JPEG +n04548280_3103.JPEG +n04270147_4573.JPEG +n04404412_2479.JPEG +n03595614_5539.JPEG +n01751748_8913.JPEG +n04065272_849.JPEG +n02979186_17453.JPEG +n02730930_465.JPEG +n01616318_6263.JPEG +n03832673_1528.JPEG +n03450230_3232.JPEG +n02793495_11700.JPEG +n01945685_3539.JPEG +n04179913_10333.JPEG +n02086910_2450.JPEG +n03045698_2052.JPEG +n02105251_7361.JPEG +n01616318_3268.JPEG +n04590129_2089.JPEG +n02110627_12077.JPEG +n02841315_15301.JPEG +n01798484_4254.JPEG +n03938244_5485.JPEG +n03496892_37974.JPEG +n02843684_4940.JPEG +n03887697_486.JPEG +n04398044_14549.JPEG +n02346627_3717.JPEG +n04111531_23668.JPEG +n02504013_6533.JPEG +n01735189_312.JPEG +n01682714_13308.JPEG +n01677366_44931.JPEG +n07590611_17896.JPEG +n04200800_20387.JPEG +n01843065_3603.JPEG +n03770439_14870.JPEG +n03929660_22157.JPEG +n03764736_7940.JPEG +n04515003_6961.JPEG +n07614500_3099.JPEG +n07760859_2955.JPEG +n04141975_11064.JPEG +n02108000_2302.JPEG +n01855032_2791.JPEG +n02091635_2018.JPEG +n03476991_16839.JPEG +n09256479_779.JPEG +n02526121_18308.JPEG +n03692522_3021.JPEG +n02992211_24896.JPEG +n04522168_530.JPEG +n02114855_4415.JPEG +n01518878_2846.JPEG +n02096585_772.JPEG +n02787622_7844.JPEG +n03658185_16337.JPEG +n04590129_22064.JPEG +n02777292_5413.JPEG +n01667114_10706.JPEG +n07730033_2614.JPEG +n02100735_2445.JPEG +n07753275_246.JPEG +n02051845_3622.JPEG +n04517823_38898.JPEG +n04004767_4401.JPEG +n09421951_14226.JPEG +n03710637_313.JPEG +n01667114_13339.JPEG +n03763968_11013.JPEG +n03447721_28125.JPEG +n02364673_512.JPEG +n04285008_10393.JPEG +n02483362_1237.JPEG +n02102480_11013.JPEG +n07697537_7383.JPEG +n03924679_8680.JPEG +n06794110_2580.JPEG +n04532106_17868.JPEG +n01601694_12063.JPEG +n04229816_8460.JPEG +n02108089_26883.JPEG +n02782093_4053.JPEG +n03775546_8401.JPEG +n03400231_19518.JPEG +n02112706_2966.JPEG +n03445777_13099.JPEG +n02095314_6009.JPEG +n01537544_738.JPEG +n04152593_46778.JPEG +n01873310_49324.JPEG +n02536864_11147.JPEG +n01910747_9473.JPEG +n07802026_12001.JPEG +n02107574_4231.JPEG +n03887697_646.JPEG +n03535780_9723.JPEG +n03706229_1756.JPEG +n04067472_2408.JPEG +n07717556_8930.JPEG +n04111531_19240.JPEG +n02111129_1682.JPEG +n04522168_11846.JPEG +n02108422_4898.JPEG +n04612504_40598.JPEG +n02504013_5848.JPEG +n07716906_5125.JPEG +n02009229_14745.JPEG +n09835506_839.JPEG +n03956157_6118.JPEG +n02058221_9823.JPEG +n07693725_14119.JPEG +n02113712_18211.JPEG +n02701002_1995.JPEG +n02112137_11728.JPEG +n03388183_12053.JPEG +n01689811_12123.JPEG +n09246464_12909.JPEG +n03602883_856.JPEG +n09229709_68586.JPEG +n04604644_2651.JPEG +n01753488_5281.JPEG +n04367480_22206.JPEG +n03933933_11738.JPEG +n02086240_9296.JPEG +n07579787_14024.JPEG +n02093859_3308.JPEG +n03706229_3819.JPEG +n02110341_12.JPEG +n02837789_13480.JPEG +n02002556_13236.JPEG +n03729826_37785.JPEG +n02790996_11460.JPEG +n02777292_11675.JPEG +n04399382_17675.JPEG +n04254120_1711.JPEG +n01797886_15785.JPEG +n02486261_5418.JPEG +n01883070_2483.JPEG +n03998194_2349.JPEG +n02892201_32956.JPEG +n03991062_23287.JPEG +n03935335_34119.JPEG +n04525305_18880.JPEG +n02106166_8912.JPEG +n02125311_14797.JPEG +n01770081_12608.JPEG +n04461696_7636.JPEG +n02091244_26.JPEG +n01943899_20323.JPEG +n03594734_42763.JPEG +n04505470_3929.JPEG +n03920288_4561.JPEG +n03630383_414.JPEG +n04270147_15260.JPEG +n02100735_5315.JPEG +n02865351_30019.JPEG +n03676483_2667.JPEG +n03804744_8157.JPEG +n01753488_6703.JPEG +n01773549_246.JPEG +n02132136_2451.JPEG +n02869837_12737.JPEG +n02279972_9908.JPEG +n04153751_3496.JPEG +n02009229_1715.JPEG +n03947888_26793.JPEG +n03250847_17765.JPEG +n01631663_150.JPEG +n03478589_17914.JPEG +n03584254_2028.JPEG +n01692333_9971.JPEG +n04090263_293.JPEG +n02110627_17631.JPEG +n02089867_4567.JPEG +n02948072_42998.JPEG +n02364673_8348.JPEG +n02112706_1394.JPEG +n02013706_18918.JPEG +n01943899_15693.JPEG +n02480855_29726.JPEG +n07754684_10162.JPEG +n03393912_6064.JPEG +n03825788_63174.JPEG +n02843684_2353.JPEG +n01796340_9562.JPEG +n03961711_2774.JPEG +n03447447_3186.JPEG +n04127249_8591.JPEG +n04162706_13863.JPEG +n02074367_5930.JPEG +n03042490_15576.JPEG +n03956157_3048.JPEG +n03042490_4783.JPEG +n02264363_3076.JPEG +n02123159_7174.JPEG +n04429376_8395.JPEG +n02894605_48654.JPEG +n04447861_3013.JPEG +n09246464_25617.JPEG +n02869837_33625.JPEG +n02102318_9714.JPEG +n04259630_16129.JPEG +n03871628_30976.JPEG +n02395406_6311.JPEG +n07730033_7338.JPEG +n01770393_28416.JPEG +n02804414_8907.JPEG +n02077923_14606.JPEG +n02088632_7944.JPEG +n02643566_163.JPEG +n02669723_884.JPEG +n02097658_4411.JPEG +n01443537_23353.JPEG +n02231487_10869.JPEG +n07695742_19317.JPEG +n04149813_10665.JPEG +n02109047_31636.JPEG +n02114855_13228.JPEG +n02326432_14957.JPEG +n04485082_17514.JPEG +n06874185_24636.JPEG +n07730033_1264.JPEG +n03995372_615.JPEG +n01644900_1941.JPEG +n04487394_35220.JPEG +n02389026_9149.JPEG +n02808304_14719.JPEG +n02100877_4588.JPEG +n02749479_3803.JPEG +n04562935_5022.JPEG +n03617480_9753.JPEG +n03697007_27734.JPEG +n02999410_25038.JPEG +n11879895_4869.JPEG +n07880968_2203.JPEG +n07697313_1329.JPEG +n03125729_11512.JPEG +n02837789_15772.JPEG +n03452741_18400.JPEG +n02037110_2760.JPEG +n03032252_11629.JPEG +n03124043_644.JPEG +n03016953_10612.JPEG +n02219486_16174.JPEG +n01806143_1737.JPEG +n02002556_4586.JPEG +n02641379_27244.JPEG +n03950228_25645.JPEG +n02807133_16536.JPEG +n01855672_6104.JPEG +n01592084_530.JPEG +n07802026_1234.JPEG +n03944341_8475.JPEG +n02134084_5937.JPEG +n02233338_7658.JPEG +n02132136_5164.JPEG +n01818515_13925.JPEG +n04090263_369.JPEG +n02106166_1264.JPEG +n02090721_756.JPEG +n02051845_5191.JPEG +n03804744_38737.JPEG +n07753275_9684.JPEG +n03976467_10897.JPEG +n02690373_9535.JPEG +n03995372_6772.JPEG +n04483307_3246.JPEG +n03710721_1159.JPEG +n01641577_3227.JPEG +n02909870_27264.JPEG +n01978455_11853.JPEG +n03445777_8681.JPEG +n07565083_11570.JPEG +n03662601_25462.JPEG +n02879718_23667.JPEG +n01695060_43160.JPEG +n01734418_17251.JPEG +n01843065_4856.JPEG +n01622779_3604.JPEG +n02099712_2224.JPEG +n01950731_537.JPEG +n03841143_3998.JPEG +n02492035_15775.JPEG +n03297495_585.JPEG +n02408429_18599.JPEG +n01796340_7371.JPEG +n02346627_62546.JPEG +n03788195_10294.JPEG +n02093754_6220.JPEG +n02808440_58331.JPEG +n03717622_3422.JPEG +n02002556_8408.JPEG +n02948072_34809.JPEG +n04251144_27816.JPEG +n01829413_8138.JPEG +n12057211_2210.JPEG +n09472597_4514.JPEG +n02111889_3809.JPEG +n01986214_12804.JPEG +n02112137_9809.JPEG +n02504458_511.JPEG +n04590129_27434.JPEG +n03127747_2538.JPEG +n02403003_10903.JPEG +n11939491_29833.JPEG +n03584254_3118.JPEG +n04523525_4233.JPEG +n02488702_6108.JPEG +n04311004_7351.JPEG +n02085936_663.JPEG +n03124043_2233.JPEG +n02480495_1463.JPEG +n01631663_1616.JPEG +n03661043_5028.JPEG +n02892767_10675.JPEG +n04099969_20650.JPEG +n04399382_18088.JPEG +n02443114_41426.JPEG +n11879895_7496.JPEG +n02113023_13403.JPEG +n03903868_39362.JPEG +n04019541_23055.JPEG +n03709823_5952.JPEG +n02123045_7753.JPEG +n02988304_6336.JPEG +n02454379_9172.JPEG +n03888257_61581.JPEG +n02708093_6890.JPEG +n03207941_2749.JPEG +n04086273_13815.JPEG +n01807496_16825.JPEG +n01882714_24587.JPEG +n02276258_10202.JPEG +n02325366_3369.JPEG +n03942813_9850.JPEG +n03954731_4877.JPEG +n02281787_3018.JPEG +n12985857_901.JPEG +n01744401_13832.JPEG +n01983481_3485.JPEG +n02510455_1432.JPEG +n01692333_18377.JPEG +n04209239_2364.JPEG +n02493509_14238.JPEG +n09468604_73816.JPEG +n02002724_17688.JPEG +n01774750_6285.JPEG +n12057211_8572.JPEG +n07720875_6046.JPEG +n01582220_2728.JPEG +n03444034_11513.JPEG +n01632777_12544.JPEG +n02090379_2262.JPEG +n03843555_10142.JPEG +n03930313_3068.JPEG +n04483307_14750.JPEG +n04604644_18736.JPEG +n13054560_7284.JPEG +n07871810_26063.JPEG +n04229816_4166.JPEG +n01774750_2607.JPEG +n03534580_12105.JPEG +n04023962_11780.JPEG +n02817516_62144.JPEG +n13054560_12465.JPEG +n04209133_4253.JPEG +n02114712_13251.JPEG +n02256656_2334.JPEG +n02124075_3661.JPEG +n02268853_40.JPEG +n02091635_5319.JPEG +n04275548_7765.JPEG +n03782006_965.JPEG +n02480855_2029.JPEG +n02643566_3483.JPEG +n03733131_5940.JPEG +n02097209_5308.JPEG +n03976467_2195.JPEG +n02113186_4665.JPEG +n04146614_10180.JPEG +n03950228_12404.JPEG +n03447447_4153.JPEG +n02892201_18529.JPEG +n02423022_10343.JPEG +n13040303_4885.JPEG +n03100240_18711.JPEG +n02091635_7542.JPEG +n04192698_96797.JPEG +n04311004_753.JPEG +n03796401_4017.JPEG +n02123045_12966.JPEG +n01749939_7032.JPEG +n02108000_2225.JPEG +n03888605_36219.JPEG +n02437616_517.JPEG +n03476684_1461.JPEG +n01980166_2488.JPEG +n03018349_19725.JPEG +n03379051_2591.JPEG +n07754684_35174.JPEG +n03998194_3085.JPEG +n02669723_9400.JPEG +n07802026_18978.JPEG +n03133878_13873.JPEG +n03709823_8021.JPEG +n02113978_5199.JPEG +n02123159_7299.JPEG +n09399592_11961.JPEG +n01978287_11742.JPEG +n03977966_23845.JPEG +n04254777_24277.JPEG +n04070727_39652.JPEG +n02321529_9734.JPEG +n02256656_13101.JPEG +n02111889_6795.JPEG +n03627232_20610.JPEG +n03661043_20653.JPEG +n02089973_2064.JPEG +n04179913_10217.JPEG +n04370456_2205.JPEG +n02980441_4027.JPEG +n03657121_2558.JPEG +n03706229_11949.JPEG +n09421951_13324.JPEG +n03240683_11350.JPEG +n02494079_5441.JPEG +n03868863_6905.JPEG +n02951358_8840.JPEG +n02105056_4430.JPEG +n02860847_10487.JPEG +n02128757_4627.JPEG +n06359193_43798.JPEG +n04127249_9157.JPEG +n02116738_40461.JPEG +n02992529_5537.JPEG +n02916936_2029.JPEG +n01784675_28588.JPEG +n02101388_11079.JPEG +n04008634_13894.JPEG +n03877472_21538.JPEG +n01688243_3062.JPEG +n04517823_269.JPEG +n01924916_1591.JPEG +n02102973_2786.JPEG +n04296562_60721.JPEG +n01883070_4648.JPEG +n02701002_14576.JPEG +n03792782_40738.JPEG +n03482405_6714.JPEG +n03876231_2374.JPEG +n04482393_4185.JPEG +n01882714_11869.JPEG +n03271574_21364.JPEG +n01644373_10062.JPEG +n01882714_10286.JPEG +n03445924_7171.JPEG +n02110185_7762.JPEG +n04254680_1737.JPEG +n03179701_30091.JPEG +n01828970_10817.JPEG +n02437312_11986.JPEG +n04310018_1010.JPEG +n01744401_8350.JPEG +n03443371_3073.JPEG +n04325704_6421.JPEG +n02206856_4424.JPEG +n01728920_16818.JPEG +n02106382_3803.JPEG +n02708093_720.JPEG +n03599486_5858.JPEG +n02490219_6868.JPEG +n01818515_30641.JPEG +n06785654_5815.JPEG +n04371430_16008.JPEG +n01978287_11272.JPEG +n03761084_11607.JPEG +n04004767_12695.JPEG +n02128385_7401.JPEG +n07754684_35478.JPEG +n02974003_219.JPEG +n04328186_17324.JPEG +n02093991_2784.JPEG +n04146614_2611.JPEG +n03970156_28377.JPEG +n07579787_7499.JPEG +n02231487_6128.JPEG +n04344873_7847.JPEG +n04590129_45757.JPEG +n03461385_56146.JPEG +n07892512_34862.JPEG +n02095889_4911.JPEG +n02102177_3100.JPEG +n02097209_550.JPEG +n04332243_6940.JPEG +n02500267_4679.JPEG +n02909870_8784.JPEG +n02492660_5658.JPEG +n04372370_25228.JPEG +n07920052_26365.JPEG +n01558993_3885.JPEG +n03485794_15642.JPEG +n02007558_12407.JPEG +n02206856_4303.JPEG +n07742313_5651.JPEG +n04310018_16939.JPEG +n02971356_26670.JPEG +n03476991_15915.JPEG +n02871525_22633.JPEG +n04147183_4044.JPEG +n02102973_7758.JPEG +n02447366_2844.JPEG +n03481172_18981.JPEG +n01955084_5867.JPEG +n06794110_2136.JPEG +n02930766_29749.JPEG +n04532106_3040.JPEG +n03180011_18486.JPEG +n01629819_6425.JPEG +n03764736_21827.JPEG +n02093428_186.JPEG +n02606052_15161.JPEG +n03179701_1165.JPEG +n02916936_3161.JPEG +n02112350_1664.JPEG +n02980441_17969.JPEG +n04429376_15432.JPEG +n01622779_2169.JPEG +n03982430_21144.JPEG +n01494475_7966.JPEG +n02980441_25342.JPEG +n01978287_4512.JPEG +n03888257_5812.JPEG +n02089973_5666.JPEG +n02361337_5817.JPEG +n01968897_12558.JPEG +n10148035_13899.JPEG +n02086910_12504.JPEG +n04507155_11698.JPEG +n03998194_6299.JPEG +n01751748_7705.JPEG +n02109961_27242.JPEG +n04081281_11008.JPEG +n04037443_13044.JPEG +n02099429_3487.JPEG +n03935335_8760.JPEG +n02977058_20209.JPEG +n04429376_7681.JPEG +n09288635_12221.JPEG +n03482405_11576.JPEG +n02422699_10.JPEG +n03535780_4442.JPEG +n02096437_48.JPEG +n07684084_3275.JPEG +n02002724_3083.JPEG +n01819313_4735.JPEG +n01531178_13216.JPEG +n13040303_3308.JPEG +n02085936_8814.JPEG +n02786058_9859.JPEG +n03063599_4181.JPEG +n02116738_39591.JPEG +n03110669_24082.JPEG +n04065272_16050.JPEG +n01978287_6262.JPEG +n01774384_2012.JPEG +n03803284_22647.JPEG +n02114712_4728.JPEG +n04467665_663.JPEG +n03314780_6044.JPEG +n04540053_6724.JPEG +n02326432_21058.JPEG +n02114855_18270.JPEG +n03992509_7007.JPEG +n02106030_873.JPEG +n01860187_682.JPEG +n03424325_14123.JPEG +n03670208_16659.JPEG +n02110185_1766.JPEG +n03710721_13287.JPEG +n02168699_7573.JPEG +n04254777_1967.JPEG +n02747177_26647.JPEG +n03770439_25921.JPEG +n07802026_2873.JPEG +n01608432_16412.JPEG +n03908618_5968.JPEG +n02107683_3817.JPEG +n04004767_13752.JPEG +n04133789_13242.JPEG +n02951585_17828.JPEG +n02231487_2481.JPEG +n02107574_1090.JPEG +n02965783_1294.JPEG +n02895154_28682.JPEG +n03781244_500.JPEG +n02120079_28014.JPEG +n06794110_1595.JPEG +n02930766_17553.JPEG +n02860847_17400.JPEG +n03240683_6673.JPEG +n03804744_6971.JPEG +n02219486_19174.JPEG +n02111277_12353.JPEG +n02109961_21155.JPEG +n03126707_10221.JPEG +n03775071_11705.JPEG +n01695060_19750.JPEG +n02869837_17354.JPEG +n02105056_15534.JPEG +n07747607_65720.JPEG +n03776460_19650.JPEG +n04548280_282.JPEG +n02667093_9780.JPEG +n01739381_1381.JPEG +n03290653_8104.JPEG +n02106382_2443.JPEG +n01775062_8898.JPEG +n01514859_4750.JPEG +n03160309_11310.JPEG +n03063689_15716.JPEG +n03485794_12139.JPEG +n07836838_5215.JPEG +n04458633_8321.JPEG +n03876231_37762.JPEG +n02860847_6865.JPEG +n04149813_4587.JPEG +n03895866_14647.JPEG +n03146219_3181.JPEG +n01443537_2456.JPEG +n02396427_9310.JPEG +n07583066_1667.JPEG +n04461696_11759.JPEG +n02437312_8688.JPEG +n04264628_6040.JPEG +n01728572_17365.JPEG +n02096294_5117.JPEG +n04429376_49511.JPEG +n02108000_309.JPEG +n03933933_10681.JPEG +n07693725_19034.JPEG +n02125311_31231.JPEG +n02963159_18695.JPEG +n03724870_40427.JPEG +n02701002_5814.JPEG +n03796401_6727.JPEG +n02093991_4356.JPEG +n01616318_1746.JPEG +n04435653_11778.JPEG +n04442312_11329.JPEG +n02128385_2660.JPEG +n04049303_9765.JPEG +n02077923_12464.JPEG +n03133878_4138.JPEG +n02328150_6435.JPEG +n02279972_2473.JPEG +n02109525_28069.JPEG +n01667114_2967.JPEG +n01697457_355.JPEG +n01484850_20155.JPEG +n01873310_3993.JPEG +n03729826_9571.JPEG +n02412080_4187.JPEG +n04532106_1105.JPEG +n04525305_17784.JPEG +n13044778_5257.JPEG +n01632777_13509.JPEG +n02606052_17106.JPEG +n02437312_3267.JPEG +n02791270_7771.JPEG +n02981792_16546.JPEG +n01735189_16617.JPEG +n02317335_26756.JPEG +n07579787_168.JPEG +n03899768_113823.JPEG +n02051845_15544.JPEG +n03179701_606.JPEG +n04579432_2793.JPEG +n03903868_15428.JPEG +n02100236_2546.JPEG +n04133789_234.JPEG +n02066245_7349.JPEG +n02112137_6867.JPEG +n02999410_18613.JPEG +n04264628_9130.JPEG +n07875152_97.JPEG +n03492542_6696.JPEG +n02110063_17474.JPEG +n02917067_18589.JPEG +n04141975_13451.JPEG +n03838899_1117.JPEG +n02276258_7483.JPEG +n03249569_19187.JPEG +n02280649_5540.JPEG +n03891332_5524.JPEG +n02095314_2059.JPEG +n03598930_553.JPEG +n03218198_7942.JPEG +n03045698_6787.JPEG +n03871628_24889.JPEG +n01692333_7299.JPEG +n03045698_3318.JPEG +n04367480_15881.JPEG +n02129165_7144.JPEG +n04146614_7566.JPEG +n04399382_23667.JPEG +n04263257_5198.JPEG +n03857828_37426.JPEG +n02087394_35503.JPEG +n03141823_10693.JPEG +n07579787_465.JPEG +n04355338_11573.JPEG +n04606251_7505.JPEG +n03187595_1082.JPEG +n03908618_26392.JPEG +n01682714_140.JPEG +n02091244_1072.JPEG +n02391049_7557.JPEG +n03180011_1169.JPEG +n02123597_1444.JPEG +n01984695_66418.JPEG +n02606052_2041.JPEG +n02056570_8960.JPEG +n02088094_1013.JPEG +n02102318_13880.JPEG +n02676566_8618.JPEG +n03590841_1466.JPEG +n03207743_7427.JPEG +n02837789_3038.JPEG +n02808440_51023.JPEG +n03649909_19921.JPEG +n07860988_14708.JPEG +n04039381_1402.JPEG +n04259630_12025.JPEG +n09288635_3404.JPEG +n01739381_4814.JPEG +n03250847_12641.JPEG +n03400231_13641.JPEG +n02687172_28499.JPEG +n02106166_2477.JPEG +n02480855_9685.JPEG +n07720875_3270.JPEG +n03271574_11160.JPEG +n02492035_6363.JPEG +n02486261_5.JPEG +n04033995_6941.JPEG +n01847000_13352.JPEG +n03218198_856.JPEG +n02174001_681.JPEG +n02804610_16428.JPEG +n02782093_26334.JPEG +n07248320_59939.JPEG +n02006656_28226.JPEG +n02108000_3324.JPEG +n04069434_2088.JPEG +n02105641_919.JPEG +n02951585_9928.JPEG +n03291819_44779.JPEG +n04153751_11700.JPEG +n02095889_13201.JPEG +n02690373_4015.JPEG +n02321529_16621.JPEG +n02965783_1150.JPEG +n04033901_27801.JPEG +n04487081_5844.JPEG +n04442312_13103.JPEG +n02106030_2284.JPEG +n02123045_9922.JPEG +n02909870_2449.JPEG +n02007558_1688.JPEG +n02130308_4755.JPEG +n04346328_13291.JPEG +n01641577_1956.JPEG +n03935335_25532.JPEG +n02107574_5089.JPEG +n02071294_32975.JPEG +n03160309_35181.JPEG +n03661043_6860.JPEG +n03124043_27086.JPEG +n03100240_18505.JPEG +n03026506_3496.JPEG +n07718747_2319.JPEG +n03874293_575.JPEG +n03047690_24882.JPEG +n03126707_23235.JPEG +n01943899_12479.JPEG +n01744401_6534.JPEG +n07716358_24289.JPEG +n02879718_12590.JPEG +n03929855_5995.JPEG +n09399592_8800.JPEG +n03045698_2497.JPEG +n02727426_13590.JPEG +n03125729_22980.JPEG +n02443484_5468.JPEG +n04554684_3614.JPEG +n02963159_8705.JPEG +n03141823_13602.JPEG +n02814860_33554.JPEG +n03014705_27257.JPEG +n02412080_4158.JPEG +n04599235_8611.JPEG +n03476991_6067.JPEG +n03534580_3745.JPEG +n02137549_1627.JPEG +n03902125_3986.JPEG +n03977966_62927.JPEG +n03000134_4209.JPEG +n07693725_10489.JPEG +n03785016_33287.JPEG +n06874185_104.JPEG +n02095889_471.JPEG +n02396427_5755.JPEG +n02279972_28771.JPEG +n02092339_609.JPEG +n02110806_3492.JPEG +n01860187_6889.JPEG +n03045698_1999.JPEG +n03314780_3744.JPEG +n07717410_11735.JPEG +n01677366_4331.JPEG +n02129604_13239.JPEG +n04371774_1920.JPEG +n02111129_4947.JPEG +n02104365_2693.JPEG +n03124043_7885.JPEG +n02328150_2124.JPEG +n01514859_25395.JPEG +n02825657_9510.JPEG +n03216828_1748.JPEG +n03483316_20180.JPEG +n02104029_4523.JPEG +n03461385_56051.JPEG +n02096585_1390.JPEG +n02106382_16379.JPEG +n01692333_6401.JPEG +n04599235_21479.JPEG +n03535780_42372.JPEG +n02110185_8166.JPEG +n02791124_1289.JPEG +n02992211_202.JPEG +n04204238_8926.JPEG +n02356798_5358.JPEG +n04443257_9894.JPEG +n04532670_8688.JPEG +n02823428_8232.JPEG +n03424325_10990.JPEG +n04589890_4892.JPEG +n02169497_6193.JPEG +n02097130_292.JPEG +n03877845_8901.JPEG +n04462240_11404.JPEG +n04372370_17666.JPEG +n04275548_160.JPEG +n03345487_135.JPEG +n04483307_1049.JPEG +n04201297_8072.JPEG +n09288635_6675.JPEG +n01944390_18319.JPEG +n07880968_1263.JPEG +n03000247_29632.JPEG +n01984695_17575.JPEG +n04404412_8091.JPEG +n02094258_3287.JPEG +n04590129_26459.JPEG +n02113978_7847.JPEG +n02094114_680.JPEG +n04355933_939.JPEG +n01728572_5662.JPEG +n02493509_16007.JPEG +n04540053_5533.JPEG +n04482393_33584.JPEG +n04423845_8373.JPEG +n01843383_4766.JPEG +n03535780_44495.JPEG +n03496892_17623.JPEG +n07697313_11188.JPEG +n04336792_9741.JPEG +n03530642_29879.JPEG +n02056570_11917.JPEG +n02114548_10669.JPEG +n03325584_4006.JPEG +n02966687_8248.JPEG +n03874599_14815.JPEG +n06359193_46289.JPEG +n02782093_20069.JPEG +n02804414_4136.JPEG +n03876231_29195.JPEG +n04507155_8693.JPEG +n01692333_5616.JPEG +n02132136_489.JPEG +n04009552_2736.JPEG +n02490219_3416.JPEG +n02412080_23906.JPEG +n02672831_59392.JPEG +n03544143_10377.JPEG +n04074963_20098.JPEG +n02013706_17883.JPEG +n04417672_4102.JPEG +n03459775_19209.JPEG +n07565083_1824.JPEG +n04532106_10349.JPEG +n04584207_2261.JPEG +n02027492_8516.JPEG +n03970156_9937.JPEG +n02992529_1739.JPEG +n04099969_13609.JPEG +n02098105_1634.JPEG +n03690938_12356.JPEG +n02776631_47577.JPEG +n01968897_15405.JPEG +n07248320_4370.JPEG +n02276258_9438.JPEG +n01755581_10238.JPEG +n03691459_46890.JPEG +n02102318_10667.JPEG +n02097658_5099.JPEG +n02114548_3049.JPEG +n03617480_4847.JPEG +n01910747_7822.JPEG +n02443484_8062.JPEG +n02098413_2037.JPEG +n02101006_3037.JPEG +n01860187_982.JPEG +n07717556_2699.JPEG +n03770439_3202.JPEG +n03032252_652.JPEG +n04251144_5201.JPEG +n01768244_2502.JPEG +n02058221_9367.JPEG +n04209133_3421.JPEG +n01518878_7631.JPEG +n03947888_42049.JPEG +n04550184_51242.JPEG +n01484850_31532.JPEG +n04204238_3940.JPEG +n04332243_30541.JPEG +n02493793_4259.JPEG +n01798484_7787.JPEG +n02102480_302.JPEG +n02442845_8401.JPEG +n02094258_775.JPEG +n03873416_55957.JPEG +n02437312_2510.JPEG +n01806143_4988.JPEG +n03400231_16236.JPEG +n03017168_2979.JPEG +n04243546_23176.JPEG +n02892767_25482.JPEG +n01860187_3821.JPEG +n04131690_8861.JPEG +n03255030_1983.JPEG +n02704792_18812.JPEG +n02101556_4851.JPEG +n03908618_5320.JPEG +n02100877_91.JPEG +n04200800_8100.JPEG +n02090721_1769.JPEG +n03530642_11328.JPEG +n03868863_11379.JPEG +n01924916_7262.JPEG +n01675722_6327.JPEG +n02364673_3081.JPEG +n02108551_1838.JPEG +n02085620_9458.JPEG +n01751748_1235.JPEG +n03494278_44425.JPEG +n02319095_7712.JPEG +n02877765_1912.JPEG +n04266014_2318.JPEG +n03627232_17549.JPEG +n04326547_12382.JPEG +n02342885_4565.JPEG +n02102040_6513.JPEG +n02033041_5566.JPEG +n04596742_43670.JPEG +n07747607_15253.JPEG +n04067472_4838.JPEG +n01687978_1626.JPEG +n02606052_15156.JPEG +n02094433_568.JPEG +n03785016_418.JPEG +n04090263_22796.JPEG +n04461696_8599.JPEG +n07717556_16190.JPEG +n02089973_4645.JPEG +n02951358_343.JPEG +n01944390_19590.JPEG +n03792782_65957.JPEG +n02817516_67632.JPEG +n02108551_4835.JPEG +n04263257_7229.JPEG +n02097658_1405.JPEG +n02951358_12954.JPEG +n03637318_9531.JPEG +n04399382_33793.JPEG +n07615774_2150.JPEG +n02101388_1851.JPEG +n02895154_44198.JPEG +n02219486_30502.JPEG +n02514041_9787.JPEG +n07718747_14472.JPEG +n07714571_177.JPEG +n01873310_53038.JPEG +n03785016_1703.JPEG +n03425413_13545.JPEG +n04579432_8851.JPEG +n04423845_9819.JPEG +n07734744_7381.JPEG +n04485082_53280.JPEG +n02051845_1071.JPEG +n01784675_15681.JPEG +n02489166_3647.JPEG +n03188531_20474.JPEG +n04355338_6058.JPEG +n01622779_5206.JPEG +n02100236_3437.JPEG +n03481172_11200.JPEG +n03467068_9275.JPEG +n04133789_5938.JPEG +n01798484_13121.JPEG +n02165456_19011.JPEG +n02281406_1425.JPEG +n02916936_4401.JPEG +n07749582_15731.JPEG +n03982430_20337.JPEG +n04335435_9287.JPEG +n03208938_16879.JPEG +n02403003_6484.JPEG +n04162706_7360.JPEG +n03124043_352.JPEG +n02105855_11614.JPEG +n04065272_7827.JPEG +n04325704_10283.JPEG +n02669723_9562.JPEG +n02110627_1931.JPEG +n02113799_341.JPEG +n01843383_4363.JPEG +n06874185_24329.JPEG +n03425413_15355.JPEG +n02009912_13930.JPEG +n07742313_9422.JPEG +n03400231_3806.JPEG +n01728920_3820.JPEG +n02110806_969.JPEG +n02018795_11476.JPEG +n01537544_553.JPEG +n09428293_23378.JPEG +n02500267_176.JPEG +n03733281_29390.JPEG +n02116738_33675.JPEG +n03899768_16193.JPEG +n02500267_8302.JPEG +n03793489_26825.JPEG +n02107574_2902.JPEG +n04482393_5691.JPEG +n02113799_693.JPEG +n01795545_16689.JPEG +n02138441_4262.JPEG +n03785016_32940.JPEG +n04044716_3395.JPEG +n07718472_10800.JPEG +n02017213_1960.JPEG +n07579787_7995.JPEG +n04251144_14898.JPEG +n03843555_1608.JPEG +n02113023_6196.JPEG +n04409515_11090.JPEG +n01829413_16080.JPEG +n03617480_2238.JPEG +n04118776_42226.JPEG +n04069434_10853.JPEG +n03529860_5355.JPEG +n02701002_4748.JPEG +n04131690_16142.JPEG +n01770081_12070.JPEG +n04258138_2911.JPEG +n03792782_37794.JPEG +n03110669_89478.JPEG +n03032252_10988.JPEG +n02129165_436.JPEG +n03478589_2308.JPEG +n02823750_5883.JPEG +n04070727_21906.JPEG +n02492035_7442.JPEG +n02091244_2345.JPEG +n04404412_27772.JPEG +n04509417_1043.JPEG +n02097298_10744.JPEG +n04204347_2246.JPEG +n02128385_15942.JPEG +n02074367_6540.JPEG +n04560804_12363.JPEG +n02097209_2175.JPEG +n02123394_32.JPEG +n04200800_9423.JPEG +n03201208_19965.JPEG +n03724870_49470.JPEG +n04273569_23774.JPEG +n02493509_14899.JPEG +n04009552_16330.JPEG +n03697007_9460.JPEG +n03483316_16638.JPEG +n04325704_5558.JPEG +n04447861_9828.JPEG +n03649909_9340.JPEG +n03775546_13669.JPEG +n01728920_1389.JPEG +n07753113_5188.JPEG +n02111129_3724.JPEG +n02091635_4647.JPEG +n01990800_6464.JPEG +n04074963_6465.JPEG +n03782006_8743.JPEG +n04125021_6053.JPEG +n02013706_6967.JPEG +n02488291_2590.JPEG +n11939491_5217.JPEG +n04606251_51481.JPEG +n01774384_4723.JPEG +n02879718_22056.JPEG +n03633091_9946.JPEG +n03018349_2883.JPEG +n02077923_5256.JPEG +n03127925_5606.JPEG +n02011460_14198.JPEG +n04532106_9284.JPEG +n02363005_2059.JPEG +n02025239_1968.JPEG +n03729826_17876.JPEG +n02412080_3699.JPEG +n03417042_19862.JPEG +n01748264_19158.JPEG +n02089973_7444.JPEG +n04486054_12535.JPEG +n02097474_13063.JPEG +n02834397_2924.JPEG +n01985128_4939.JPEG +n02835271_21439.JPEG +n04532106_13700.JPEG +n07875152_3194.JPEG +n01675722_1516.JPEG +n02325366_7286.JPEG +n07718472_26998.JPEG +n01847000_13060.JPEG +n03000684_16976.JPEG +n04554684_2080.JPEG +n04553703_23950.JPEG +n09193705_318.JPEG +n04235860_616.JPEG +n04259630_4218.JPEG +n03544143_8466.JPEG +n13037406_2181.JPEG +n07720875_4522.JPEG +n04458633_12723.JPEG +n03131574_11683.JPEG +n03063599_4766.JPEG +n03908618_10250.JPEG +n03160309_4112.JPEG +n04356056_3872.JPEG +n03954731_51739.JPEG +n02091032_652.JPEG +n02177972_1812.JPEG +n03793489_11180.JPEG +n03935335_2320.JPEG +n03888257_11809.JPEG +n02488702_5901.JPEG +n01534433_14273.JPEG +n03729826_164.JPEG +n04328186_63.JPEG +n02168699_7822.JPEG +n01440764_22963.JPEG +n04371430_12533.JPEG +n02127052_4496.JPEG +n02641379_4913.JPEG +n03584254_2932.JPEG +n03777754_9277.JPEG +n02110341_10517.JPEG +n03982430_6136.JPEG +n09835506_23632.JPEG +n04162706_7437.JPEG +n02132136_278.JPEG +n03838899_10111.JPEG +n04592741_4024.JPEG +n07248320_8553.JPEG +n02509815_535.JPEG +n02951358_3834.JPEG +n04525305_10710.JPEG +n04239074_13715.JPEG +n12620546_16718.JPEG +n02101006_12853.JPEG +n01843383_9366.JPEG +n02948072_5496.JPEG +n02138441_3616.JPEG +n03787032_4992.JPEG +n01734418_12253.JPEG +n02403003_17813.JPEG +n02107142_15369.JPEG +n02423022_8955.JPEG +n02236044_1105.JPEG +n02361337_9994.JPEG +n02804610_19739.JPEG +n03127747_7365.JPEG +n02092002_15836.JPEG +n12768682_47813.JPEG +n01806567_2810.JPEG +n02799071_4894.JPEG +n02447366_16095.JPEG +n01843383_11645.JPEG +n01943899_15224.JPEG +n04235860_5279.JPEG +n02112018_5167.JPEG +n04596742_23019.JPEG +n01608432_10487.JPEG +n04482393_10083.JPEG +n02102040_3621.JPEG +n02823428_11641.JPEG +n02091134_18397.JPEG +n12985857_6761.JPEG +n02120079_6241.JPEG +n01756291_8564.JPEG +n02607072_898.JPEG +n02346627_12629.JPEG +n02640242_19811.JPEG +n01737021_18011.JPEG +n10148035_10408.JPEG +n02097298_8302.JPEG +n03179701_28199.JPEG +n01883070_3158.JPEG +n01985128_9825.JPEG +n02111889_6268.JPEG +n04074963_20561.JPEG +n03314780_8729.JPEG +n01775062_7862.JPEG +n03297495_1383.JPEG +n03871628_4846.JPEG +n02704792_1200.JPEG +n04366367_9896.JPEG +n02817516_407.JPEG +n03642806_20167.JPEG +n02127052_19364.JPEG +n02317335_13218.JPEG +n02110958_1054.JPEG +n04509417_6547.JPEG +n02687172_40979.JPEG +n01797886_31335.JPEG +n07745940_3808.JPEG +n03271574_24470.JPEG +n03887697_8076.JPEG +n02002724_3221.JPEG +n01664065_2241.JPEG +n03602883_10108.JPEG +n02325366_5741.JPEG +n01742172_26646.JPEG +n02268853_7935.JPEG +n01580077_994.JPEG +n02364673_52375.JPEG +n02655020_12937.JPEG +n02129604_5632.JPEG +n01608432_699.JPEG +n03935335_4214.JPEG +n01698640_24112.JPEG +n02172182_10806.JPEG +n03866082_2342.JPEG +n01882714_28243.JPEG +n09246464_79658.JPEG +n04125021_26902.JPEG +n03887697_5253.JPEG +n07693725_9218.JPEG +n02110341_7802.JPEG +n04252225_6453.JPEG +n04501370_5357.JPEG +n01797886_6852.JPEG +n07892512_6122.JPEG +n03933933_24161.JPEG +n04235860_4338.JPEG +n03991062_7215.JPEG +n09472597_57259.JPEG +n01704323_17173.JPEG +n02965783_681.JPEG +n02111500_1352.JPEG +n01592084_5696.JPEG +n03095699_11958.JPEG +n13052670_10948.JPEG +n02088364_8566.JPEG +n02108551_8215.JPEG +n04328186_12172.JPEG +n02088364_3585.JPEG +n04136333_12208.JPEG +n03179701_76243.JPEG +n02325366_1834.JPEG +n03255030_348.JPEG +n02012849_2483.JPEG +n03627232_18888.JPEG +n02132136_15870.JPEG +n01986214_2446.JPEG +n04418357_34097.JPEG +n02276258_1828.JPEG +n02325366_6541.JPEG +n01806143_8344.JPEG +n02328150_4673.JPEG +n04243546_5476.JPEG +n04252077_1246.JPEG +n01728920_20518.JPEG +n02115641_10172.JPEG +n04026417_5759.JPEG +n02807133_13339.JPEG +n03721384_35893.JPEG +n02444819_5895.JPEG +n04380533_1848.JPEG +n04591157_2078.JPEG +n02894605_78222.JPEG +n01985128_319.JPEG +n04285008_4999.JPEG +n01855672_3610.JPEG +n07920052_18791.JPEG +n04136333_1472.JPEG +n01833805_4297.JPEG +n02817516_10706.JPEG +n04328186_26830.JPEG +n01514859_12756.JPEG +n02804414_6224.JPEG +n02730930_2458.JPEG +n03250847_8253.JPEG +n01631663_8529.JPEG +n03874293_1998.JPEG +n01795545_647.JPEG +n04116512_50695.JPEG +n02095889_12469.JPEG +n04536866_16299.JPEG +n03977966_28500.JPEG +n13037406_2908.JPEG +n01744401_911.JPEG +n04409515_18516.JPEG +n03598930_17239.JPEG +n03657121_6330.JPEG +n02105855_10333.JPEG +n02117135_31.JPEG +n04507155_32125.JPEG +n03028079_24227.JPEG +n03782006_4514.JPEG +n07714571_6867.JPEG +n04044716_17511.JPEG +n04344873_8924.JPEG +n03372029_469.JPEG +n02117135_4005.JPEG +n02177972_1665.JPEG +n03992509_970.JPEG +n02102040_649.JPEG +n04286575_5235.JPEG +n02776631_6631.JPEG +n02966687_15537.JPEG +n03942813_3069.JPEG +n02117135_4069.JPEG +n02093256_1358.JPEG +n02951585_19779.JPEG +n01986214_7401.JPEG +n03041632_22214.JPEG +n04273569_3244.JPEG +n03109150_14208.JPEG +n02951358_33042.JPEG +n04462240_9448.JPEG +n01776313_10398.JPEG +n03857828_22718.JPEG +n02280649_6853.JPEG +n02837789_6435.JPEG +n02484975_6678.JPEG +n04552348_11896.JPEG +n02113624_7204.JPEG +n03935335_4217.JPEG +n02930766_30369.JPEG +n03404251_909.JPEG +n01843383_8042.JPEG +n02013706_3856.JPEG +n03676483_4778.JPEG +n03717622_2870.JPEG +n01795545_11029.JPEG +n02113978_6705.JPEG +n01560419_2690.JPEG +n03814906_39336.JPEG +n04270147_3256.JPEG +n02106166_9671.JPEG +n02097298_12647.JPEG +n02977058_5727.JPEG +n09428293_508.JPEG +n02992211_34164.JPEG +n04204347_9775.JPEG +n07760859_7328.JPEG +n04540053_6852.JPEG +n04127249_4719.JPEG +n01631663_2308.JPEG +n04447861_4843.JPEG +n04536866_18293.JPEG +n03720891_13329.JPEG +n04612504_13668.JPEG +n02268443_8365.JPEG +n03666591_28731.JPEG +n02364673_19839.JPEG +n03976467_584.JPEG +n04228054_16771.JPEG +n03065424_15475.JPEG +n03717622_12550.JPEG +n09256479_10052.JPEG +n02749479_34968.JPEG +n02077923_7516.JPEG +n04367480_31471.JPEG +n02277742_26065.JPEG +n03908714_5876.JPEG +n02640242_5565.JPEG +n02091244_3278.JPEG +n02100583_20244.JPEG +n03743016_29314.JPEG +n03661043_18599.JPEG +n04458633_8864.JPEG +n02165456_19346.JPEG +n04522168_3997.JPEG +n01534433_33722.JPEG +n01795545_5980.JPEG +n02088238_2905.JPEG +n02091635_8759.JPEG +n03047690_47679.JPEG +n03388549_6694.JPEG +n07716906_4797.JPEG +n02002556_9075.JPEG +n03425413_14874.JPEG +n01833805_7341.JPEG +n04376876_12211.JPEG +n01824575_11138.JPEG +n01798484_11798.JPEG +n03929855_4453.JPEG +n03937543_7894.JPEG +n03733805_20953.JPEG +n07248320_7633.JPEG +n03196217_7192.JPEG +n03710637_9390.JPEG +n02165105_11736.JPEG +n02087046_17983.JPEG +n02510455_4548.JPEG +n02219486_20163.JPEG +n02834397_7932.JPEG +n04039381_12070.JPEG +n02978881_8693.JPEG +n02085782_6169.JPEG +n02096051_904.JPEG +n03769881_5301.JPEG +n07717410_6531.JPEG +n03976657_9700.JPEG +n03787032_7418.JPEG +n02979186_8445.JPEG +n01742172_10917.JPEG +n03697007_21474.JPEG +n02492035_357.JPEG +n04285008_2390.JPEG +n03110669_90746.JPEG +n03485407_1044.JPEG +n03888257_13896.JPEG +n03895866_63368.JPEG +n03345487_12603.JPEG +n03803284_8453.JPEG +n04493381_4886.JPEG +n03642806_12368.JPEG +n02443114_20224.JPEG +n04613696_19878.JPEG +n04517823_32348.JPEG +n02104365_4255.JPEG +n02488291_6122.JPEG +n03773504_11813.JPEG +n04429376_7258.JPEG +n03124043_8430.JPEG +n02783161_16424.JPEG +n04557648_6060.JPEG +n01806143_3427.JPEG +n02127052_30350.JPEG +n03085013_24793.JPEG +n01795545_9895.JPEG +n01682714_16937.JPEG +n02233338_23486.JPEG +n02494079_6085.JPEG +n03125729_945.JPEG +n03891332_2734.JPEG +n02096177_5543.JPEG +n02105505_197.JPEG +n02342885_4031.JPEG +n13037406_3488.JPEG +n03888605_1609.JPEG +n03930630_4915.JPEG +n01689811_5902.JPEG +n02999410_15931.JPEG +n04456115_5498.JPEG +n03124170_9524.JPEG +n04606251_12332.JPEG +n02123597_543.JPEG +n09246464_23298.JPEG +n01828970_8507.JPEG +n03032252_6544.JPEG +n02483362_11003.JPEG +n03187595_10143.JPEG +n02510455_91917.JPEG +n03877845_13367.JPEG +n02966687_13681.JPEG +n02086079_10555.JPEG +n01735189_21359.JPEG +n07248320_12728.JPEG +n11879895_8170.JPEG +n03743016_20453.JPEG +n02236044_1975.JPEG +n03259280_663.JPEG +n01819313_6242.JPEG +n03063689_1324.JPEG +n02102040_1695.JPEG +n01824575_3108.JPEG +n02101556_3625.JPEG +n02111500_1455.JPEG +n04392985_9665.JPEG +n01704323_3671.JPEG +n01592084_3671.JPEG +n04476259_17412.JPEG +n02002556_486.JPEG +n04522168_6512.JPEG +n03888605_3040.JPEG +n04026417_22438.JPEG +n02112137_15277.JPEG +n07697313_1425.JPEG +n04336792_9007.JPEG +n07747607_7964.JPEG +n02174001_140.JPEG +n02123159_8267.JPEG +n04023962_21988.JPEG +n07730033_12642.JPEG +n02783161_8769.JPEG +n01622779_2421.JPEG +n04380533_7123.JPEG +n02999410_6923.JPEG +n02086910_12971.JPEG +n01950731_4291.JPEG +n03290653_195.JPEG +n01667778_4768.JPEG +n04235860_18012.JPEG +n04049303_1507.JPEG +n03018349_6702.JPEG +n02814533_22177.JPEG +n04070727_10001.JPEG +n03935335_15467.JPEG +n07932039_9716.JPEG +n02117135_4347.JPEG +n03271574_5339.JPEG +n03216828_62144.JPEG +n03710193_6678.JPEG +n02978881_12817.JPEG +n04019541_39497.JPEG +n07695742_8444.JPEG +n01795545_2149.JPEG +n02666196_11223.JPEG +n07753275_53465.JPEG +n03649909_20515.JPEG +n02966687_9891.JPEG +n02013706_3068.JPEG +n04209133_6153.JPEG +n01689811_476.JPEG +n01978455_2004.JPEG +n01739381_1214.JPEG +n02028035_29741.JPEG +n03000684_8965.JPEG +n02107312_105.JPEG +n02108915_8385.JPEG +n02279972_18367.JPEG +n07715103_15025.JPEG +n01742172_2240.JPEG +n01943899_12232.JPEG +n03240683_13134.JPEG +n02119022_3560.JPEG +n02094114_1972.JPEG +n07715103_16714.JPEG +n03825788_19962.JPEG +n02108915_2926.JPEG +n01748264_13952.JPEG +n04532670_11998.JPEG +n03982430_26908.JPEG +n02137549_3593.JPEG +n02966687_878.JPEG +n03733281_9312.JPEG +n01729977_17952.JPEG +n03691459_3488.JPEG +n02229544_7783.JPEG +n03980874_547.JPEG +n02927161_3595.JPEG +n04507155_3037.JPEG +n01592084_5892.JPEG +n01694178_8803.JPEG +n02017213_5562.JPEG +n02091134_9253.JPEG +n07932039_18324.JPEG +n04204238_1284.JPEG +n02971356_13771.JPEG +n03763968_6356.JPEG +n03720891_191.JPEG +n04554684_59638.JPEG +n02219486_25694.JPEG +n02117135_15869.JPEG +n01558993_18877.JPEG +n01498041_4729.JPEG +n02317335_383.JPEG +n04613696_1197.JPEG +n03769881_6530.JPEG +n01968897_4025.JPEG +n03485407_10692.JPEG +n03447721_70235.JPEG +n02769748_12087.JPEG +n03388043_16151.JPEG +n04251144_5360.JPEG +n06359193_31205.JPEG +n01693334_7723.JPEG +n02457408_10203.JPEG +n07613480_32359.JPEG +n02114855_14517.JPEG +n07760859_459.JPEG +n03492542_6801.JPEG +n04370456_1853.JPEG +n04532670_16784.JPEG +n03814639_16299.JPEG +n04557648_257.JPEG +n03075370_6360.JPEG +n03661043_6008.JPEG +n03938244_21210.JPEG +n09399592_50900.JPEG +n03444034_7693.JPEG +n07717556_7404.JPEG +n02108915_930.JPEG +n04596742_31552.JPEG +n03871628_1093.JPEG +n01753488_3937.JPEG +n02486261_12146.JPEG +n04146614_3522.JPEG +n03089624_104471.JPEG +n04553703_12321.JPEG +n03888605_9065.JPEG +n02106382_1198.JPEG +n03982430_27531.JPEG +n04120489_2823.JPEG +n07720875_8615.JPEG +n03026506_593.JPEG +n04487081_15267.JPEG +n02445715_15972.JPEG +n03633091_14707.JPEG +n02100583_26408.JPEG +n04116512_10317.JPEG +n03868242_7700.JPEG +n02927161_15193.JPEG +n02504013_9647.JPEG +n04264628_4009.JPEG +n04553703_2026.JPEG +n02056570_9495.JPEG +n02101556_1923.JPEG +n01694178_2734.JPEG +n07754684_24522.JPEG +n02009912_6848.JPEG +n02109961_67908.JPEG +n02808440_33515.JPEG +n04604644_2993.JPEG +n03544143_1278.JPEG +n04326547_6989.JPEG +n09468604_10287.JPEG +n02007558_107.JPEG +n02974003_11467.JPEG +n01498041_11083.JPEG +n03014705_9535.JPEG +n03207941_881.JPEG +n07734744_17794.JPEG +n04347754_56757.JPEG +n04136333_395.JPEG +n04392985_8361.JPEG +n04004767_13000.JPEG +n04376876_9910.JPEG +n04579432_21322.JPEG +n03891332_3261.JPEG +n02110806_2192.JPEG +n03924679_11657.JPEG +n03666591_17243.JPEG +n09246464_3667.JPEG +n02108422_8892.JPEG +n01601694_4711.JPEG +n04131690_6422.JPEG +n04141975_18609.JPEG +n02128385_2224.JPEG +n04154565_4450.JPEG +n03938244_12654.JPEG +n03803284_1208.JPEG +n02100236_4198.JPEG +n02113186_961.JPEG +n03272010_11276.JPEG +n04562935_7646.JPEG +n01833805_6774.JPEG +n13037406_2294.JPEG +n02965783_2639.JPEG +n03535780_15147.JPEG +n03197337_1528.JPEG +n04330267_2786.JPEG +n01616318_2439.JPEG +n04579145_3324.JPEG +n07590611_2351.JPEG +n04332243_20490.JPEG +n03207941_14382.JPEG +n02965783_3268.JPEG +n01631663_10162.JPEG +n03803284_90.JPEG +n02099712_1251.JPEG +n01518878_193.JPEG +n03089624_11791.JPEG +n04259630_15824.JPEG +n04592741_14653.JPEG +n03991062_19031.JPEG +n03355925_15356.JPEG +n07930864_16537.JPEG +n12267677_24035.JPEG +n02865351_10918.JPEG +n03887697_6016.JPEG +n07716358_28074.JPEG +n03063689_15778.JPEG +n02105641_3668.JPEG +n02877765_10542.JPEG +n03942813_13579.JPEG +n03047690_39412.JPEG +n02165456_800.JPEG +n04328186_2262.JPEG +n09835506_4380.JPEG +n04613696_10129.JPEG +n02107683_1003.JPEG +n02102177_3454.JPEG +n02917067_18537.JPEG +n03666591_44213.JPEG +n03710637_4421.JPEG +n02098105_2967.JPEG +n02776631_44519.JPEG +n02033041_2835.JPEG +n01818515_9492.JPEG +n07745940_10640.JPEG +n04409515_10723.JPEG +n02109961_56135.JPEG +n02489166_8982.JPEG +n02992529_60015.JPEG +n03814906_34271.JPEG +n07930864_23371.JPEG +n02514041_9156.JPEG +n02106382_10544.JPEG +n04209133_361.JPEG +n02403003_8492.JPEG +n02277742_36175.JPEG +n02871525_28026.JPEG +n02607072_3123.JPEG +n03146219_7627.JPEG +n02085936_5545.JPEG +n02895154_44344.JPEG +n02111889_2425.JPEG +n03794056_13940.JPEG +n03602883_1377.JPEG +n03028079_5852.JPEG +n02480855_11992.JPEG +n02790996_8361.JPEG +n04239074_10706.JPEG +n02096294_5870.JPEG +n02843684_3186.JPEG +n02963159_13404.JPEG +n02840245_4091.JPEG +n02085782_5971.JPEG +n01944390_14212.JPEG +n03207743_9409.JPEG +n07248320_89610.JPEG +n02100877_475.JPEG +n03788195_1496.JPEG +n04552348_6865.JPEG +n03485407_1353.JPEG +n01873310_16781.JPEG +n02086079_924.JPEG +n07695742_11180.JPEG +n01749939_7652.JPEG +n02500267_8572.JPEG +n02113978_6676.JPEG +n04238763_9881.JPEG +n02782093_3072.JPEG +n01737021_11491.JPEG +n03777568_7003.JPEG +n03920288_643.JPEG +n07583066_6828.JPEG +n02099712_5965.JPEG +n01729322_11428.JPEG +n02910353_5108.JPEG +n03187595_10142.JPEG +n01873310_29183.JPEG +n03197337_37.JPEG +n03141823_6145.JPEG +n02112350_2523.JPEG +n03109150_24732.JPEG +n03125729_2413.JPEG +n01806143_12637.JPEG +n02526121_5465.JPEG +n01833805_9088.JPEG +n02988304_2552.JPEG +n02823428_2210.JPEG +n02006656_148.JPEG +n03250847_22978.JPEG +n03670208_4982.JPEG +n01496331_31946.JPEG +n03854065_53973.JPEG +n01877812_11177.JPEG +n01494475_2200.JPEG +n03874293_11728.JPEG +n02777292_12629.JPEG +n02786058_10298.JPEG +n01820546_2172.JPEG +n02804610_5803.JPEG +n12267677_26909.JPEG +n04090263_26022.JPEG +n04296562_42295.JPEG +n02791124_3792.JPEG +n02843684_3997.JPEG +n01819313_4403.JPEG +n02510455_14365.JPEG +n02410509_20001.JPEG +n03887697_18072.JPEG +n04039381_39722.JPEG +n01582220_10244.JPEG +n01924916_8467.JPEG +n04487394_19056.JPEG +n03450230_12287.JPEG +n02790996_6975.JPEG +n02492660_6512.JPEG +n01860187_16269.JPEG +n07836838_28616.JPEG +n01930112_13472.JPEG +n02483708_5828.JPEG +n04081281_57096.JPEG +n02939185_10292.JPEG +n04254680_1819.JPEG +n04579145_2038.JPEG +n03761084_10171.JPEG +n03089624_12534.JPEG +n03208938_12494.JPEG +n01797886_34053.JPEG +n02328150_10935.JPEG +n03272562_2929.JPEG +n03131574_27021.JPEG +n03899768_57147.JPEG +n02992529_13102.JPEG +n07831146_577.JPEG +n03929660_4848.JPEG +n01755581_1841.JPEG +n02906734_9699.JPEG +n03854065_15113.JPEG +n03133878_12265.JPEG +n02229544_9775.JPEG +n02112350_4693.JPEG +n02326432_38529.JPEG +n03444034_6355.JPEG +n03814906_56758.JPEG +n01514668_21043.JPEG +n03388549_1017.JPEG +n04238763_4723.JPEG +n02951585_13453.JPEG +n04009552_11412.JPEG +n03388549_9570.JPEG +n02058221_3846.JPEG +n02361337_4692.JPEG +n04599235_20573.JPEG +n02398521_6038.JPEG +n02115913_3452.JPEG +n02093256_38295.JPEG +n02125311_234.JPEG +n03014705_66477.JPEG +n02841315_2592.JPEG +n02486410_1110.JPEG +n02487347_3176.JPEG +n02823428_1954.JPEG +n02699494_18583.JPEG +n02672831_5261.JPEG +n03494278_30295.JPEG +n01498041_9070.JPEG +n04049303_9328.JPEG +n03775546_9442.JPEG +n02128385_700.JPEG +n02916936_1865.JPEG +n02137549_2775.JPEG +n04536866_3805.JPEG +n02105162_10594.JPEG +n03188531_1873.JPEG +n01770393_19597.JPEG +n07920052_17394.JPEG +n03476684_20097.JPEG +n03680355_2325.JPEG +n02107312_7717.JPEG +n02096437_3191.JPEG +n02814860_31896.JPEG +n02669723_8501.JPEG +n02606052_20797.JPEG +n04557648_2156.JPEG +n01807496_7321.JPEG +n07716358_22674.JPEG +n02815834_8354.JPEG +n02089867_3705.JPEG +n07836838_8561.JPEG +n03658185_10127.JPEG +n04033901_33201.JPEG +n02056570_1323.JPEG +n03937543_1252.JPEG +n02497673_9084.JPEG +n07695742_8489.JPEG +n03891251_1499.JPEG +n03838899_34131.JPEG +n03534580_5847.JPEG +n02481823_19621.JPEG +n02123597_13934.JPEG +n02804414_2573.JPEG +n02110063_5060.JPEG +n01806567_2680.JPEG +n04277352_23413.JPEG +n03980874_2174.JPEG +n04325704_20992.JPEG +n02091244_7958.JPEG +n03075370_6005.JPEG +n02096294_4663.JPEG +n01817953_3792.JPEG +n01843065_9387.JPEG +n04486054_2433.JPEG +n02992529_10647.JPEG +n04201297_7763.JPEG +n03494278_42255.JPEG +n03977966_47667.JPEG +n02423022_957.JPEG +n07716906_658.JPEG +n03492542_1218.JPEG +n02096437_678.JPEG +n03733805_10094.JPEG +n07717410_2437.JPEG +n02088238_2701.JPEG +n04270147_8532.JPEG +n02669723_13662.JPEG +n02028035_9251.JPEG +n03495258_5885.JPEG +n07714571_1086.JPEG +n04254120_2652.JPEG +n02814533_3697.JPEG +n04493381_27191.JPEG +n12057211_1504.JPEG +n02859443_40949.JPEG +n02119022_9484.JPEG +n02120505_857.JPEG +n02128925_12300.JPEG +n01664065_15082.JPEG +n04429376_4675.JPEG +n02777292_22422.JPEG +n04133789_8597.JPEG +n11939491_12072.JPEG +n03930313_5713.JPEG +n02066245_9177.JPEG +n02127052_2187.JPEG +n02089867_4173.JPEG +n04277352_4807.JPEG +n01978287_227.JPEG +n03485794_13907.JPEG +n01796340_18022.JPEG +n01755581_25227.JPEG +n01980166_1803.JPEG +n01704323_4768.JPEG +n02107908_10154.JPEG +n04461696_23366.JPEG +n02687172_83969.JPEG +n02396427_22015.JPEG +n02606052_21676.JPEG +n09472597_4563.JPEG +n04591157_429.JPEG +n13040303_681.JPEG +n04443257_23089.JPEG +n02950826_16025.JPEG +n02137549_6229.JPEG +n03733281_49569.JPEG +n01768244_379.JPEG +n02101388_13698.JPEG +n04553703_2907.JPEG +n03902125_1838.JPEG +n02113712_2732.JPEG +n02708093_1119.JPEG +n03717622_1365.JPEG +n02107142_21580.JPEG +n02804610_6469.JPEG +n04069434_3558.JPEG +n02894605_873.JPEG +n02319095_7133.JPEG +n03325584_21778.JPEG +n02169497_2701.JPEG +n02009229_2336.JPEG +n02111129_2119.JPEG +n02101556_2623.JPEG +n03388183_2997.JPEG +n03216828_13026.JPEG +n03721384_15989.JPEG +n04146614_436.JPEG +n03126707_957.JPEG +n01883070_4762.JPEG +n02106662_2066.JPEG +n02514041_3934.JPEG +n02974003_14368.JPEG +n02098413_9712.JPEG +n02966193_39351.JPEG +n02410509_451.JPEG +n03126707_18811.JPEG +n02097209_5984.JPEG +n01664065_3813.JPEG +n04523525_12246.JPEG +n02281787_1901.JPEG +n03706229_5542.JPEG +n02111129_1065.JPEG +n07932039_7099.JPEG +n04525038_30380.JPEG +n01532829_19921.JPEG +n03032252_77310.JPEG +n02988304_8897.JPEG +n02025239_1425.JPEG +n02494079_5411.JPEG +n02930766_13208.JPEG +n03109150_2427.JPEG +n02835271_9862.JPEG +n02841315_10537.JPEG +n02895154_29289.JPEG +n01945685_26771.JPEG +n03384352_7608.JPEG +n04462240_10231.JPEG +n02486261_5192.JPEG +n03042490_307.JPEG +n03891251_3462.JPEG +n03877472_4070.JPEG +n02097047_4548.JPEG +n03970156_22286.JPEG +n02085936_8340.JPEG +n02130308_19517.JPEG +n03976467_9504.JPEG +n03633091_17418.JPEG +n01914609_1882.JPEG +n03047690_194.JPEG +n02128757_21012.JPEG +n02132136_2777.JPEG +n03529860_22487.JPEG +n02085782_5190.JPEG +n07693725_893.JPEG +n04509417_5980.JPEG +n04239074_4131.JPEG +n02486261_6729.JPEG +n02101556_3256.JPEG +n03658185_5210.JPEG +n03355925_18495.JPEG +n02504013_4485.JPEG +n03016953_7245.JPEG +n01694178_7693.JPEG +n04228054_16717.JPEG +n02804610_4315.JPEG +n01693334_11574.JPEG +n03902125_123.JPEG +n04153751_7950.JPEG +n01560419_12765.JPEG +n12985857_9854.JPEG +n03935335_26889.JPEG +n02109047_1659.JPEG +n02128925_3699.JPEG +n04067472_11826.JPEG +n02423022_6521.JPEG +n02112350_110.JPEG +n03495258_17788.JPEG +n03873416_5167.JPEG +n07615774_23000.JPEG +n02119022_9634.JPEG +n07584110_10661.JPEG +n01768244_4994.JPEG +n03773504_7896.JPEG +n01534433_16172.JPEG +n02108422_2953.JPEG +n03676483_4414.JPEG +n02497673_80.JPEG +n04509417_6487.JPEG +n04591713_1326.JPEG +n03992509_2495.JPEG +n02092002_1995.JPEG +n01945685_18238.JPEG +n01773797_1741.JPEG +n03014705_1746.JPEG +n01629819_13004.JPEG +n04330267_14775.JPEG +n03956157_15679.JPEG +n02794156_4846.JPEG +n01753488_6283.JPEG +n02129604_10669.JPEG +n03160309_44855.JPEG +n03062245_5399.JPEG +n01440764_8479.JPEG +n07880968_6446.JPEG +n02094258_4466.JPEG +n02219486_22888.JPEG +n04179913_2689.JPEG +n03770679_14901.JPEG +n02894605_22245.JPEG +n03388043_1288.JPEG +n02107574_2348.JPEG +n01817953_1047.JPEG +n02025239_6797.JPEG +n04254120_3881.JPEG +n02099601_20018.JPEG +n03388043_3337.JPEG +n04335435_2240.JPEG +n03538406_260.JPEG +n02037110_4637.JPEG +n04120489_3999.JPEG +n04370456_19989.JPEG +n02510455_1059.JPEG +n07749582_14778.JPEG +n04264628_27604.JPEG +n03742115_28921.JPEG +n03929660_28356.JPEG +n02484975_11544.JPEG +n03042490_7102.JPEG +n03773504_8848.JPEG +n04023962_3321.JPEG +n02948072_34079.JPEG +n04254680_8721.JPEG +n01828970_15890.JPEG +n01984695_80226.JPEG +n02497673_1021.JPEG +n03602883_15325.JPEG +n02927161_3393.JPEG +n01847000_15205.JPEG +n02869837_13425.JPEG +n02099429_1384.JPEG +n04486054_1319.JPEG +n03445924_6062.JPEG +n03920288_3013.JPEG +n03637318_5820.JPEG +n13052670_487.JPEG +n03938244_10567.JPEG +n03787032_9475.JPEG +n01784675_22784.JPEG +n04346328_382.JPEG +n04557648_3114.JPEG +n04277352_30361.JPEG +n07768694_18126.JPEG +n02107683_1747.JPEG +n01873310_19925.JPEG +n04350905_9622.JPEG +n03967562_8158.JPEG +n03538406_8318.JPEG +n03492542_49506.JPEG +n02443114_25725.JPEG +n01601694_21328.JPEG +n02106382_257.JPEG +n04357314_2255.JPEG +n03400231_16046.JPEG +n03017168_64059.JPEG +n04044716_3934.JPEG +n03832673_15603.JPEG +n04371774_7336.JPEG +n02137549_7195.JPEG +n01494475_6034.JPEG +n02268853_1263.JPEG +n02422699_12306.JPEG +n03187595_19390.JPEG +n02966193_39991.JPEG +n09332890_38116.JPEG +n02097298_9337.JPEG +n02111889_3123.JPEG +n04548362_29525.JPEG +n03272010_4778.JPEG +n02869837_29893.JPEG +n04523525_21052.JPEG +n01930112_16806.JPEG +n02494079_10477.JPEG +n02177972_8110.JPEG +n03976657_9079.JPEG +n02783161_25294.JPEG +n03598930_43.JPEG +n02397096_3609.JPEG +n02127052_2248.JPEG +n02843684_1392.JPEG +n03662601_12308.JPEG +n01484850_14751.JPEG +n04355933_3359.JPEG +n02445715_1312.JPEG +n03633091_28715.JPEG +n03483316_9817.JPEG +n03857828_8236.JPEG +n03944341_8254.JPEG +n04606251_7428.JPEG +n01984695_39718.JPEG +n02113186_13424.JPEG +n01687978_3089.JPEG +n02417914_11687.JPEG +n04033995_22175.JPEG +n02119789_8510.JPEG +n02093859_3280.JPEG +n02102177_2066.JPEG +n02133161_18699.JPEG +n03271574_491.JPEG +n03452741_1655.JPEG +n02093859_1264.JPEG +n03594945_4791.JPEG +n03617480_10873.JPEG +n02091244_5638.JPEG +n04120489_5665.JPEG +n02860847_28639.JPEG +n03670208_48012.JPEG +n03126707_1280.JPEG +n03933933_18064.JPEG +n02488702_406.JPEG +n01641577_8018.JPEG +n01608432_6959.JPEG +n03874293_4252.JPEG +n01770393_12063.JPEG +n04447861_1712.JPEG +n02127052_16867.JPEG +n07734744_2075.JPEG +n02017213_6692.JPEG +n02107142_18979.JPEG +n02837789_14858.JPEG +n01440764_17789.JPEG +n01728572_25793.JPEG +n03482405_5681.JPEG +n09468604_51963.JPEG +n04366367_5077.JPEG +n07831146_4309.JPEG +n02088238_7660.JPEG +n03384352_1768.JPEG +n02091244_4459.JPEG +n02391049_3276.JPEG +n07697537_20245.JPEG +n04264628_4642.JPEG +n01756291_17263.JPEG +n04254120_2550.JPEG +n01667778_6039.JPEG +n03733131_22932.JPEG +n04317175_1093.JPEG +n01877812_8488.JPEG +n02123597_2083.JPEG +n02319095_7569.JPEG +n09399592_59724.JPEG +n02988304_2650.JPEG +n10565667_3697.JPEG +n03443371_1021.JPEG +n09332890_13890.JPEG +n04542943_6091.JPEG +n02206856_3970.JPEG +n03916031_7717.JPEG +n03874599_8576.JPEG +n04356056_8224.JPEG +n04417672_9492.JPEG +n02104365_5784.JPEG +n04116512_9609.JPEG +n03770679_13386.JPEG +n01751748_2336.JPEG +n01537544_15263.JPEG +n04265275_3655.JPEG +n03868242_7207.JPEG +n04579145_2643.JPEG +n02098286_4254.JPEG +n07932039_9848.JPEG +n01669191_4791.JPEG +n02769748_25223.JPEG +n04560804_2993.JPEG +n01955084_7336.JPEG +n02441942_8073.JPEG +n03733131_7722.JPEG +n04590129_30298.JPEG +n01819313_134.JPEG +n01806143_5753.JPEG +n02085936_14974.JPEG +n11879895_5334.JPEG +n03478589_13074.JPEG +n04147183_33296.JPEG +n02398521_8322.JPEG +n03775071_2722.JPEG +n04467665_3094.JPEG +n01729322_14291.JPEG +n01930112_2186.JPEG +n03937543_3060.JPEG +n03942813_1889.JPEG +n01776313_2111.JPEG +n04264628_3513.JPEG +n03743016_17730.JPEG +n02093256_15222.JPEG +n07613480_24734.JPEG +n01775062_1361.JPEG +n02117135_4490.JPEG +n07768694_3801.JPEG +n02098105_4036.JPEG +n02108915_1945.JPEG +n03249569_38872.JPEG +n03485794_61588.JPEG +n03709823_5864.JPEG +n02098105_2472.JPEG +n02102973_7297.JPEG +n03478589_4917.JPEG +n02091244_9477.JPEG +n09399592_62902.JPEG +n04118776_19441.JPEG +n09399592_23704.JPEG +n07717556_1787.JPEG +n02094433_22867.JPEG +n03967562_7806.JPEG +n04389033_9597.JPEG +n03259280_2305.JPEG +n04209239_11384.JPEG +n03594945_8821.JPEG +n03781244_30110.JPEG +n04133789_17644.JPEG +n02097130_11656.JPEG +n02133161_14397.JPEG +n02978881_7806.JPEG +n02672831_9687.JPEG +n02447366_2057.JPEG +n02105162_9475.JPEG +n01498041_11905.JPEG +n01687978_8014.JPEG +n03838899_32779.JPEG +n02099429_4235.JPEG +n04606251_1849.JPEG +n01740131_7327.JPEG +n03250847_3732.JPEG +n02804610_92.JPEG +n02130308_2827.JPEG +n02493509_13665.JPEG +n03814906_30180.JPEG +n02097658_2661.JPEG +n02389026_9443.JPEG +n03042490_2204.JPEG +n02655020_11180.JPEG +n01582220_1592.JPEG +n03141823_6.JPEG +n02017213_266.JPEG +n02408429_2885.JPEG +n03692522_3347.JPEG +n03642806_19547.JPEG +n01774384_5133.JPEG +n02892767_13526.JPEG +n03028079_24183.JPEG +n03482405_10770.JPEG +n02607072_4441.JPEG +n01580077_33143.JPEG +n04493381_15655.JPEG +n04005630_21045.JPEG +n03958227_7491.JPEG +n02112706_3095.JPEG +n01740131_10748.JPEG +n04548362_31561.JPEG +n03803284_4037.JPEG +n01632777_7794.JPEG +n02865351_9064.JPEG +n03445777_4814.JPEG +n03662601_6916.JPEG +n03527444_2031.JPEG +n04141327_8156.JPEG +n04579145_2114.JPEG +n03785016_3166.JPEG +n04146614_15170.JPEG +n02510455_95958.JPEG +n02802426_9952.JPEG +n03717622_8570.JPEG +n01945685_10525.JPEG +n03887697_650.JPEG +n04277352_3262.JPEG +n03995372_720.JPEG +n04259630_2175.JPEG +n03388043_1299.JPEG +n02814860_23279.JPEG +n07930864_25883.JPEG +n02111277_3315.JPEG +n02264363_11480.JPEG +n02094114_8596.JPEG +n04443257_18141.JPEG +n01740131_5678.JPEG +n02088466_8450.JPEG +n03891251_1509.JPEG +n03776460_6124.JPEG +n02110063_14891.JPEG +n03891251_3746.JPEG +n03690938_11633.JPEG +n03017168_80389.JPEG +n03877845_15218.JPEG +n01817953_7555.JPEG +n03793489_1703.JPEG +n09256479_9595.JPEG +n02107142_14723.JPEG +n03697007_12351.JPEG +n02100583_3815.JPEG +n01770393_3878.JPEG +n03045698_12969.JPEG +n04487081_15601.JPEG +n02415577_51694.JPEG +n02111129_384.JPEG +n02009229_559.JPEG +n04037443_43992.JPEG +n03733131_23103.JPEG +n01943899_11517.JPEG +n03992509_1735.JPEG +n04037443_514.JPEG +n02321529_6062.JPEG +n02692877_13003.JPEG +n03903868_8684.JPEG +n03673027_20305.JPEG +n03016953_6527.JPEG +n04409515_4396.JPEG +n03532672_45283.JPEG +n02098105_2456.JPEG +n02134084_15019.JPEG +n03047690_353.JPEG +n03125729_24190.JPEG +n02006656_4977.JPEG +n03825788_12318.JPEG +n04591157_3910.JPEG +n10565667_810.JPEG +n07584110_8872.JPEG +n03843555_6652.JPEG +n03599486_16379.JPEG +n02097658_6165.JPEG +n04328186_1029.JPEG +n04392985_5043.JPEG +n02018207_5279.JPEG +n04311004_9337.JPEG +n02114548_109.JPEG +n03544143_10052.JPEG +n02229544_20321.JPEG +n03690938_9988.JPEG +n07768694_10883.JPEG +n02494079_1525.JPEG +n02100877_22676.JPEG +n03047690_13947.JPEG +n01644900_5425.JPEG +n03777754_1550.JPEG +n07697313_1110.JPEG +n02096437_10719.JPEG +n04553703_18998.JPEG +n03291819_5663.JPEG +n03063599_386.JPEG +n04336792_3700.JPEG +n02256656_7821.JPEG +n02085620_9971.JPEG +n04346328_14475.JPEG +n04266014_7812.JPEG +n02088632_5568.JPEG +n03445924_3274.JPEG +n01440764_8673.JPEG +n03494278_30396.JPEG +n11939491_7405.JPEG +n03868242_2764.JPEG +n02119789_10143.JPEG +n02930766_17599.JPEG +n02871525_22188.JPEG +n02777292_14816.JPEG +n03476684_1011.JPEG +n03796401_7556.JPEG +n03476684_155.JPEG +n02088238_363.JPEG +n03494278_17669.JPEG +n04404412_15954.JPEG +n02948072_3369.JPEG +n02120505_2963.JPEG +n02113799_247.JPEG +n02091635_8010.JPEG +n13052670_4654.JPEG +n03041632_18311.JPEG +n02490219_3165.JPEG +n01990800_16728.JPEG +n03478589_12586.JPEG +n04116512_42561.JPEG +n01644900_1166.JPEG +n03832673_913.JPEG +n01756291_10414.JPEG +n03982430_35946.JPEG +n01797886_20993.JPEG +n03095699_27040.JPEG +n02123159_4109.JPEG +n04389033_20558.JPEG +n02509815_13092.JPEG +n07749582_10453.JPEG +n02109525_30045.JPEG +n07695742_418.JPEG +n03404251_8490.JPEG +n03841143_30404.JPEG +n03761084_8602.JPEG +n04127249_614.JPEG +n04118538_1197.JPEG +n04487081_19409.JPEG +n02883205_20480.JPEG +n01601694_24172.JPEG +n01924916_6960.JPEG +n02110806_9493.JPEG +n02099849_4842.JPEG +n02097209_6729.JPEG +n04037443_404.JPEG +n02101388_6427.JPEG +n02403003_5981.JPEG +n01688243_1566.JPEG +n02177972_3083.JPEG +n04347754_40509.JPEG +n02107312_2300.JPEG +n03854065_2917.JPEG +n04200800_46985.JPEG +n02328150_6768.JPEG +n04326547_10067.JPEG +n02395406_1174.JPEG +n02892201_28434.JPEG +n01560419_7390.JPEG +n04423845_13136.JPEG +n01687978_1820.JPEG +n02206856_2736.JPEG +n03223299_5340.JPEG +n03961711_11815.JPEG +n02093647_5810.JPEG +n02776631_6069.JPEG +n02859443_7459.JPEG +n03721384_10278.JPEG +n04141076_33767.JPEG +n03769881_6600.JPEG +n03937543_10406.JPEG +n02396427_28291.JPEG +n04254777_20133.JPEG +n04275548_14085.JPEG +n01843065_9844.JPEG +n06785654_17009.JPEG +n02120505_20569.JPEG +n02859443_42289.JPEG +n02769748_94850.JPEG +n07715103_7027.JPEG +n04597913_2042.JPEG +n01729322_9571.JPEG +n02480855_7027.JPEG +n04370456_4225.JPEG +n02879718_37270.JPEG +n02100735_9445.JPEG +n07565083_8952.JPEG +n02091134_16062.JPEG +n12620546_61430.JPEG +n02701002_20751.JPEG +n01560419_7909.JPEG +n03840681_43446.JPEG +n02226429_970.JPEG +n02097209_2793.JPEG +n03384352_3613.JPEG +n03075370_5037.JPEG +n04311174_913.JPEG +n03967562_28496.JPEG +n04099969_24708.JPEG +n04069434_8190.JPEG +n03866082_484.JPEG +n03630383_3636.JPEG +n02119789_1029.JPEG +n03255030_11194.JPEG +n02843684_11989.JPEG +n01806143_3926.JPEG +n03425413_19020.JPEG +n03584829_15011.JPEG +n01986214_9019.JPEG +n02098286_3075.JPEG +n02123597_31.JPEG +n02096585_2840.JPEG +n03347037_20057.JPEG +n01847000_9173.JPEG +n01644373_4721.JPEG +n04344873_3058.JPEG +n04355338_8267.JPEG +n04442312_17032.JPEG +n02815834_13051.JPEG +n01728572_22324.JPEG +n04311174_4915.JPEG +n02095314_637.JPEG +n02219486_21400.JPEG +n01532829_9619.JPEG +n02165105_10066.JPEG +n02134418_4343.JPEG +n04141076_26833.JPEG +n03291819_30141.JPEG +n03791053_17727.JPEG +n02443114_23300.JPEG +n04328186_397.JPEG +n04418357_9371.JPEG +n03452741_10838.JPEG +n02095314_243.JPEG +n01855032_4148.JPEG +n03982430_19317.JPEG +n04552348_20345.JPEG +n02859443_16347.JPEG +n04033995_19031.JPEG +n02951585_23176.JPEG +n03761084_35491.JPEG +n02113712_5483.JPEG +n02105641_2155.JPEG +n01795545_10624.JPEG +n02704792_22749.JPEG +n03028079_10873.JPEG +n01776313_16168.JPEG +n01855672_7210.JPEG +n03272562_17174.JPEG +n02092339_3291.JPEG +n02417914_8571.JPEG +n02102480_7986.JPEG +n03866082_5856.JPEG +n03954731_3906.JPEG +n03929660_10921.JPEG +n04486054_647.JPEG +n04540053_1463.JPEG +n02422106_1696.JPEG +n03461385_4806.JPEG +n02802426_26710.JPEG +n01580077_1916.JPEG +n01729977_683.JPEG +n03220513_13848.JPEG +n03388549_8925.JPEG +n03133878_5158.JPEG +n02108000_1481.JPEG +n02129165_18327.JPEG +n04065272_28191.JPEG +n02098413_614.JPEG +n07892512_28403.JPEG +n02102040_6313.JPEG +n02883205_10414.JPEG +n02115913_169.JPEG +n04116512_274.JPEG +n02177972_9570.JPEG +n03658185_16826.JPEG +n02319095_10095.JPEG +n02786058_15500.JPEG +n01829413_2747.JPEG +n02117135_13172.JPEG +n03223299_6929.JPEG +n04554684_10522.JPEG +n04330267_1986.JPEG +n03903868_2755.JPEG +n06596364_12692.JPEG +n02447366_4044.JPEG +n01798484_8100.JPEG +n01704323_7421.JPEG +n04515003_28088.JPEG +n01820546_6717.JPEG +n04423845_1183.JPEG +n04252225_10651.JPEG +n03950228_5222.JPEG +n03841143_33064.JPEG +n01560419_289.JPEG +n02108422_6639.JPEG +n03899768_27139.JPEG +n02981792_1794.JPEG +n02906734_3629.JPEG +n01632777_21671.JPEG +n03991062_2248.JPEG +n02782093_878.JPEG +n03837869_7278.JPEG +n02094114_1023.JPEG +n02883205_58941.JPEG +n03895866_13462.JPEG +n03443371_23125.JPEG +n04004767_3413.JPEG +n03617480_14258.JPEG +n01560419_2017.JPEG +n02397096_2608.JPEG +n09421951_20816.JPEG +n03376595_10396.JPEG +n03134739_5644.JPEG +n06794110_178.JPEG +n01498041_8263.JPEG +n07860988_11930.JPEG +n04542943_5557.JPEG +n01883070_2262.JPEG +n02910353_9468.JPEG +n04259630_14634.JPEG +n04599235_17673.JPEG +n04591157_2154.JPEG +n07892512_13840.JPEG +n02002724_2735.JPEG +n03916031_7248.JPEG +n03223299_8650.JPEG +n02123394_6602.JPEG +n03840681_14436.JPEG +n03297495_2091.JPEG +n02128925_57845.JPEG +n03710193_13550.JPEG +n04243546_14692.JPEG +n03062245_944.JPEG +n03207743_4945.JPEG +n04335435_1648.JPEG +n01698640_8125.JPEG +n04277352_3606.JPEG +n02104365_5336.JPEG +n02098105_2297.JPEG +n02814860_5135.JPEG +n02490219_4182.JPEG +n07615774_2559.JPEG +n04486054_11023.JPEG +n07745940_6806.JPEG +n04004767_3840.JPEG +n02100236_5549.JPEG +n07742313_331.JPEG +n02098105_1310.JPEG +n03788195_24712.JPEG +n02641379_14052.JPEG +n03843555_7431.JPEG +n04266014_3645.JPEG +n02108000_2635.JPEG +n03794056_6045.JPEG +n02526121_1758.JPEG +n02823750_771.JPEG +n02481823_8574.JPEG +n04118538_4036.JPEG +n12998815_8982.JPEG +n03992509_4538.JPEG +n03481172_301.JPEG +n03530642_3896.JPEG +n04023962_9940.JPEG +n01820546_6753.JPEG +n04200800_14339.JPEG +n04238763_16957.JPEG +n03944341_10553.JPEG +n03127747_4894.JPEG +n03843555_8456.JPEG +n02708093_1834.JPEG +n03777754_1868.JPEG +n02747177_4376.JPEG +n01693334_6582.JPEG +n04179913_15361.JPEG +n02666196_4735.JPEG +n03903868_6904.JPEG +n02066245_6842.JPEG +n04548280_8942.JPEG +n02113624_8362.JPEG +n04118538_4857.JPEG +n03538406_4952.JPEG +n02066245_903.JPEG +n01829413_1474.JPEG +n03908714_4745.JPEG +n13133613_50904.JPEG +n02233338_10635.JPEG +n01768244_11550.JPEG +n02114855_13601.JPEG +n04317175_2309.JPEG +n04023962_7251.JPEG +n07747607_53831.JPEG +n07753592_1827.JPEG +n03769881_2387.JPEG +n04479046_16416.JPEG +n07753275_15022.JPEG +n02397096_83.JPEG +n04311004_10738.JPEG +n02093859_4668.JPEG +n03786901_13043.JPEG +n02398521_20182.JPEG +n02396427_23137.JPEG +n01614925_11489.JPEG +n03196217_4032.JPEG +n02396427_13731.JPEG +n03042490_1904.JPEG +n03000247_11203.JPEG +n03764736_14490.JPEG +n07860988_5680.JPEG +n02256656_11226.JPEG +n02108089_2872.JPEG +n03450230_2134.JPEG +n03770439_4506.JPEG +n02120079_1207.JPEG +n07716906_2657.JPEG +n04026417_30061.JPEG +n06794110_3704.JPEG +n07860988_2284.JPEG +n02948072_8822.JPEG +n04266014_5492.JPEG +n09472597_12028.JPEG +n02071294_42844.JPEG +n04067472_11008.JPEG +n04019541_43903.JPEG +n07753592_3261.JPEG +n03980874_4927.JPEG +n03393912_10458.JPEG +n01883070_9063.JPEG +n02128385_11817.JPEG +n02007558_21871.JPEG +n03786901_8484.JPEG +n07615774_34309.JPEG +n02091032_4242.JPEG +n07742313_11865.JPEG +n02093647_1721.JPEG +n04325704_17860.JPEG +n02092002_10292.JPEG +n02106550_4602.JPEG +n03895866_93534.JPEG +n02256656_4549.JPEG +n04311004_4861.JPEG +n01616318_3818.JPEG +n01532829_11007.JPEG +n02009229_17010.JPEG +n02977058_8563.JPEG +n03459775_27.JPEG +n04118538_9211.JPEG +n03691459_44572.JPEG +n02526121_11182.JPEG +n04005630_10431.JPEG +n01843065_1594.JPEG +n02107908_4536.JPEG +n02099267_244.JPEG +n04239074_1926.JPEG +n02797295_3190.JPEG +n02423022_6218.JPEG +n03000134_3130.JPEG +n02486410_14765.JPEG +n01665541_1592.JPEG +n02111500_2093.JPEG +n03633091_15985.JPEG +n04347754_91153.JPEG +n07714990_252.JPEG +n01776313_8455.JPEG +n03089624_33096.JPEG +n02095570_6380.JPEG +n03314780_1586.JPEG +n03995372_770.JPEG +n07760859_5902.JPEG +n12620546_27441.JPEG +n01798484_8752.JPEG +n07734744_13445.JPEG +n03602883_10354.JPEG +n07718472_8422.JPEG +n01820546_3778.JPEG +n02012849_2803.JPEG +n01491361_3202.JPEG +n03866082_4487.JPEG +n01828970_2532.JPEG +n03095699_27625.JPEG +n02105162_3443.JPEG +n03018349_10834.JPEG +n03530642_16908.JPEG +n03838899_27721.JPEG +n03761084_1855.JPEG +n01795545_3327.JPEG +n10565667_10493.JPEG +n02229544_23904.JPEG +n02500267_4298.JPEG +n02100877_26048.JPEG +n02133161_2767.JPEG +n02051845_16142.JPEG +n02894605_93390.JPEG +n02966193_33139.JPEG +n04550184_58882.JPEG +n03450230_11542.JPEG +n02917067_1268.JPEG +n03873416_71791.JPEG +n01833805_3233.JPEG +n02892201_14655.JPEG +n02105855_8903.JPEG +n03384352_15275.JPEG +n02906734_2583.JPEG +n02965783_2793.JPEG +n04251144_22649.JPEG +n02939185_32283.JPEG +n03594945_16427.JPEG +n03450230_46392.JPEG +n03873416_21107.JPEG +n03498962_13496.JPEG +n02106030_6498.JPEG +n02504013_6520.JPEG +n04435653_2687.JPEG +n03110669_38622.JPEG +n03249569_41036.JPEG +n02492035_8895.JPEG +n02096051_4851.JPEG +n03868863_9229.JPEG +n01855032_7988.JPEG +n03483316_2718.JPEG +n04258138_4851.JPEG +n03125729_13522.JPEG +n03706229_829.JPEG +n02099267_765.JPEG +n02085782_2595.JPEG +n01872401_17160.JPEG +n03459775_14681.JPEG +n01677366_14099.JPEG +n03857828_10393.JPEG +n03379051_841.JPEG +n01739381_2791.JPEG +n04033995_546.JPEG +n12267677_26540.JPEG +n02966687_3603.JPEG +n02486261_9053.JPEG +n04209239_1147.JPEG +n04069434_2836.JPEG +n02840245_3518.JPEG +n03476991_36515.JPEG +n03788365_4386.JPEG +n09468604_11038.JPEG +n02128925_1592.JPEG +n03627232_15412.JPEG +n02094114_8560.JPEG +n02363005_2151.JPEG +n02791124_1187.JPEG +n03770439_18812.JPEG +n02526121_3363.JPEG +n11939491_27689.JPEG +n01796340_10853.JPEG +n03868863_7810.JPEG +n02120079_13264.JPEG +n02870880_22323.JPEG +n02088466_7508.JPEG +n02088094_2131.JPEG +n01983481_10161.JPEG +n02395406_22287.JPEG +n02870880_4395.JPEG +n03529860_8291.JPEG +n07613480_15502.JPEG +n03787032_2109.JPEG +n02412080_16410.JPEG +n04275548_10273.JPEG +n03721384_6175.JPEG +n04243546_14229.JPEG +n02106550_163.JPEG +n03657121_6090.JPEG +n02980441_14323.JPEG +n02106662_19413.JPEG +n03584829_8701.JPEG +n04228054_18476.JPEG +n04418357_3209.JPEG +n02077923_433.JPEG +n07590611_11883.JPEG +n01534433_11359.JPEG +n02317335_34140.JPEG +n02097130_8146.JPEG +n03977966_16443.JPEG +n02412080_16172.JPEG +n02930766_2005.JPEG +n02493509_11896.JPEG +n07875152_3759.JPEG +n03895866_81714.JPEG +n02109961_24123.JPEG +n02138441_9636.JPEG +n01820546_1525.JPEG +n07742313_5342.JPEG +n03980874_9358.JPEG +n04428191_34096.JPEG +n03903868_54066.JPEG +n02071294_32117.JPEG +n04328186_31715.JPEG +n02100877_4252.JPEG +n02123045_13394.JPEG +n03637318_9442.JPEG +n07693725_6745.JPEG +n04192698_22587.JPEG +n03983396_6570.JPEG +n01773157_1498.JPEG +n01855032_6378.JPEG +n03658185_11094.JPEG +n02105056_656.JPEG +n02804414_10521.JPEG +n03000134_2654.JPEG +n02099429_1359.JPEG +n07932039_9876.JPEG +n02814533_91536.JPEG +n02099267_2689.JPEG +n03483316_16879.JPEG +n01675722_3174.JPEG +n04264628_20756.JPEG +n04040759_1706.JPEG +n03709823_6124.JPEG +n02457408_15380.JPEG +n02123159_5148.JPEG +n01667778_3154.JPEG +n02795169_17500.JPEG +n04335435_25589.JPEG +n04200800_9033.JPEG +n04325704_709.JPEG +n03637318_7359.JPEG +n06596364_1350.JPEG +n07873807_11276.JPEG +n04259630_1630.JPEG +n02749479_4911.JPEG +n01753488_6052.JPEG +n03786901_12897.JPEG +n02128385_7079.JPEG +n02106030_17438.JPEG +n03496892_14192.JPEG +n02109525_8196.JPEG +n03180011_14766.JPEG +n04525038_2306.JPEG +n04482393_12884.JPEG +n02097298_6665.JPEG +n02066245_5438.JPEG +n01945685_16119.JPEG +n03347037_15243.JPEG +n07932039_18350.JPEG +n04465501_7453.JPEG +n04613696_2884.JPEG +n03476684_14937.JPEG +n02096437_1984.JPEG +n04133789_15624.JPEG +n07565083_7237.JPEG +n07684084_2644.JPEG +n01917289_2795.JPEG +n03891251_989.JPEG +n03388183_9307.JPEG +n03424325_14014.JPEG +n01917289_3945.JPEG +n02099712_1321.JPEG +n04553703_2214.JPEG +n02980441_10725.JPEG +n04604644_2267.JPEG +n02138441_10541.JPEG +n02097047_3384.JPEG +n01773549_2700.JPEG +n01531178_17121.JPEG +n02808304_17881.JPEG +n03344393_2347.JPEG +n02123597_7400.JPEG +n04317175_14705.JPEG +n04376876_31474.JPEG +n03447447_11394.JPEG +n02098413_3029.JPEG +n03942813_5257.JPEG +n01685808_8363.JPEG +n03794056_26127.JPEG +n02793495_29898.JPEG +n01694178_3686.JPEG +n02804414_242.JPEG +n03544143_18571.JPEG +n03535780_30271.JPEG +n02095570_11497.JPEG +n02483708_853.JPEG +n02422106_1911.JPEG +n04235860_10104.JPEG +n01882714_5680.JPEG +n01494475_17717.JPEG +n02504013_1382.JPEG +n09468604_66908.JPEG +n02422106_9914.JPEG +n01776313_33287.JPEG +n07717410_1355.JPEG +n04548362_10811.JPEG +n03187595_11330.JPEG +n04081281_114593.JPEG +n02097130_5959.JPEG +n04026417_3011.JPEG +n04033901_6199.JPEG +n04423845_19964.JPEG +n04023962_46827.JPEG +n01622779_6291.JPEG +n02346627_14311.JPEG +n04141076_83111.JPEG +n02398521_85190.JPEG +n02107908_12220.JPEG +n02488291_1271.JPEG +n09193705_13279.JPEG +n02910353_10650.JPEG +n02607072_511.JPEG +n03379051_1222.JPEG +n12144580_46457.JPEG +n04356056_47919.JPEG +n03485407_1758.JPEG +n03876231_5680.JPEG +n03404251_11218.JPEG +n01664065_22400.JPEG +n02841315_16847.JPEG +n03788195_12117.JPEG +n03673027_2956.JPEG +n02909870_662.JPEG +n04350905_64863.JPEG +n02869837_5978.JPEG +n03109150_14332.JPEG +n03220513_21771.JPEG +n02110185_7049.JPEG +n03633091_17466.JPEG +n01537544_4042.JPEG +n03444034_4631.JPEG +n02105251_4381.JPEG +n02088238_2036.JPEG +n04398044_6388.JPEG +n02106166_23016.JPEG +n01871265_6174.JPEG +n02025239_2630.JPEG +n01871265_7596.JPEG +n02105251_1240.JPEG +n04154565_13738.JPEG +n02236044_1711.JPEG +n03776460_5470.JPEG +n03710637_2107.JPEG +n02107908_11515.JPEG +n03065424_8659.JPEG +n02486410_6396.JPEG +n03598930_3567.JPEG +n07754684_8659.JPEG +n03445924_1860.JPEG +n02978881_9727.JPEG +n03804744_32441.JPEG +n02091032_1600.JPEG +n03627232_5318.JPEG +n03877845_14355.JPEG +n03804744_1186.JPEG +n03877845_3420.JPEG +n03127925_18127.JPEG +n01744401_6556.JPEG +n04044716_19491.JPEG +n02174001_2867.JPEG +n01985128_8263.JPEG +n02643566_434.JPEG +n02100583_4376.JPEG +n02033041_952.JPEG +n03733281_1473.JPEG +n07742313_1048.JPEG +n03916031_50204.JPEG +n04456115_2652.JPEG +n06794110_1628.JPEG +n03770679_10543.JPEG +n03534580_21094.JPEG +n02105056_2911.JPEG +n03908618_7980.JPEG +n04493381_18715.JPEG +n01496331_7810.JPEG +n04501370_8145.JPEG +n03598930_3801.JPEG +n04330267_6384.JPEG +n03337140_37622.JPEG +n02484975_2904.JPEG +n02091831_1518.JPEG +n02117135_2938.JPEG +n02113624_3851.JPEG +n03598930_10786.JPEG +n02037110_12278.JPEG +n03160309_60897.JPEG +n03933933_20205.JPEG +n02966687_17447.JPEG +n04372370_20031.JPEG +n02110958_4547.JPEG +n03673027_32864.JPEG +n01860187_8063.JPEG +n04330267_17350.JPEG +n03485407_21197.JPEG +n03124043_4408.JPEG +n02259212_2307.JPEG +n02788148_26384.JPEG +n03794056_31476.JPEG +n02799071_12931.JPEG +n03769881_3441.JPEG +n03291819_29708.JPEG +n02106166_9968.JPEG +n02494079_7589.JPEG +n04522168_2731.JPEG +n03891332_4749.JPEG +n03947888_19541.JPEG +n03259280_296.JPEG +n02018795_14682.JPEG +n02410509_1332.JPEG +n03916031_5015.JPEG +n02094433_9978.JPEG +n02799071_31264.JPEG +n01498041_6128.JPEG +n02113978_1478.JPEG +n02111277_46963.JPEG +n04263257_821.JPEG +n03857828_42380.JPEG +n04204347_4589.JPEG +n02802426_20043.JPEG +n03995372_3314.JPEG +n03958227_6942.JPEG +n01807496_1719.JPEG +n04409515_2719.JPEG +n04366367_11952.JPEG +n03709823_25825.JPEG +n02797295_25838.JPEG +n02840245_19020.JPEG +n04418357_17556.JPEG +n02871525_9265.JPEG +n02086910_10308.JPEG +n01753488_1870.JPEG +n07920052_7737.JPEG +n01943899_19759.JPEG +n01532829_11626.JPEG +n02165456_46525.JPEG +n01883070_5442.JPEG +n02690373_5565.JPEG +n02174001_534.JPEG +n04591157_1226.JPEG +n03482405_27134.JPEG +n01729322_1679.JPEG +n01882714_347.JPEG +n04125021_805.JPEG +n02190166_9486.JPEG +n02111889_2670.JPEG +n03134739_4371.JPEG +n04120489_28664.JPEG +n02708093_6252.JPEG +n02128757_999.JPEG +n01514859_3103.JPEG +n04044716_5849.JPEG +n04461696_6476.JPEG +n04009552_1912.JPEG +n02002724_7168.JPEG +n02361337_10127.JPEG +n12057211_3559.JPEG +n03495258_21874.JPEG +n03598930_11287.JPEG +n03325584_3085.JPEG +n02814533_44670.JPEG +n02128925_19999.JPEG +n01667778_3919.JPEG +n02104365_1640.JPEG +n04086273_4584.JPEG +n02443114_6019.JPEG +n12985857_6261.JPEG +n02999410_4368.JPEG +n04486054_3276.JPEG +n03124043_3027.JPEG +n02111277_3000.JPEG +n03868242_6663.JPEG +n03424325_8217.JPEG +n02177972_1886.JPEG +n02892201_4932.JPEG +n04579145_4754.JPEG +n02342885_381.JPEG +n03483316_3091.JPEG +n02825657_11522.JPEG +n03272010_6388.JPEG +n03388043_13796.JPEG +n02086646_5739.JPEG +n01644900_8122.JPEG +n03670208_3971.JPEG +n09246464_76734.JPEG +n04523525_22504.JPEG +n02776631_6975.JPEG +n01740131_3151.JPEG +n02112350_6007.JPEG +n04584207_10463.JPEG +n03590841_6401.JPEG +n02971356_39748.JPEG +n03063689_2347.JPEG +n02730930_5609.JPEG +n02074367_7634.JPEG +n03874599_6049.JPEG +n02097047_1505.JPEG +n02493793_8535.JPEG +n01806143_6433.JPEG +n04209239_6508.JPEG +n04483307_10245.JPEG +n02870880_16595.JPEG +n01860187_36662.JPEG +n03109150_10870.JPEG +n04033995_23991.JPEG +n01644373_4011.JPEG +n02129604_13540.JPEG +n02101006_3011.JPEG +n02823750_4113.JPEG +n02123045_9413.JPEG +n03249569_71889.JPEG +n02480855_21414.JPEG +n04515003_8881.JPEG +n04435653_2741.JPEG +n02134418_4157.JPEG +n04443257_28579.JPEG +n02107908_5622.JPEG +n03763968_4448.JPEG +n02417914_20158.JPEG +n02835271_3513.JPEG +n13054560_2751.JPEG +n04033995_6408.JPEG +n04111531_4749.JPEG +n04133789_1217.JPEG +n03658185_21925.JPEG +n03291819_1351.JPEG +n02492660_3686.JPEG +n01484850_19203.JPEG +n02100877_5883.JPEG +n02992211_32668.JPEG +n02445715_14966.JPEG +n02790996_4778.JPEG +n02101006_3848.JPEG +n04065272_50269.JPEG +n04086273_19958.JPEG +n01689811_9039.JPEG +n02109525_2737.JPEG +n03201208_2863.JPEG +n04041544_23641.JPEG +n04252077_4699.JPEG +n02096294_4001.JPEG +n03649909_37671.JPEG +n03787032_2230.JPEG +n02111500_4331.JPEG +n02105505_2484.JPEG +n01986214_20285.JPEG +n04067472_9447.JPEG +n03026506_1272.JPEG +n04070727_21195.JPEG +n01601694_21207.JPEG +n01582220_1395.JPEG +n01530575_9329.JPEG +n03444034_5301.JPEG +n02256656_2153.JPEG +n02119022_11494.JPEG +n03290653_2437.JPEG +n04591157_6796.JPEG +n03709823_1186.JPEG +n04044716_6076.JPEG +n02102177_227.JPEG +n02114367_1515.JPEG +n02704792_10031.JPEG +n04548362_78926.JPEG +n04026417_30773.JPEG +n02259212_1689.JPEG +n01530575_7401.JPEG +n03888257_33818.JPEG +n03494278_37813.JPEG +n03197337_2741.JPEG +n03018349_1413.JPEG +n02106550_2824.JPEG +n01534433_2020.JPEG +n02085620_3875.JPEG +n04380533_1473.JPEG +n04277352_12022.JPEG +n03724870_16357.JPEG +n04418357_4959.JPEG +n03425413_15837.JPEG +n02116738_2979.JPEG +n07930864_54662.JPEG +n02095570_7226.JPEG +n01608432_1097.JPEG +n04310018_4407.JPEG +n04579145_5289.JPEG +n02097658_2682.JPEG +n02093991_2850.JPEG +n03983396_1509.JPEG +n07716906_7432.JPEG +n03792782_10267.JPEG +n04141327_4260.JPEG +n01819313_4536.JPEG +n07716358_16290.JPEG +n01828970_24149.JPEG +n01729977_1037.JPEG +n09193705_60125.JPEG +n07768694_15674.JPEG +n01531178_20132.JPEG +n04263257_8665.JPEG +n01798484_5972.JPEG +n03666591_24316.JPEG +n01728572_13260.JPEG +n03590841_10273.JPEG +n04515003_7014.JPEG +n01770393_10221.JPEG +n04238763_4805.JPEG +n02951585_22442.JPEG +n01687978_7504.JPEG +n09421951_6932.JPEG +n02321529_7601.JPEG +n04371430_20701.JPEG +n01514859_3371.JPEG +n03325584_4560.JPEG +n02025239_11414.JPEG +n02776631_10445.JPEG +n04366367_11559.JPEG +n02128385_23824.JPEG +n04208210_1463.JPEG +n12267677_8785.JPEG +n04254120_1940.JPEG +n02328150_860.JPEG +n03016953_19770.JPEG +n01924916_6981.JPEG +n04026417_13877.JPEG +n02396427_1266.JPEG +n03868242_8283.JPEG +n01582220_10835.JPEG +n03673027_29101.JPEG +n02088466_4344.JPEG +n02104029_761.JPEG +n02093991_805.JPEG +n02916936_1874.JPEG +n02091244_596.JPEG +n04252225_174.JPEG +n02087046_20662.JPEG +n07802026_751.JPEG +n02281787_912.JPEG +n02483708_351.JPEG +n03452741_4667.JPEG +n04310018_1330.JPEG +n01983481_26098.JPEG +n03146219_23358.JPEG +n02085782_8363.JPEG +n04356056_6318.JPEG +n03535780_3517.JPEG +n03476684_15988.JPEG +n02132136_3839.JPEG +n02877765_1150.JPEG +n02094433_7499.JPEG +n07753113_1359.JPEG +n04296562_21698.JPEG +n04019541_14800.JPEG +n03345487_15136.JPEG +n03709823_26325.JPEG +n03769881_13540.JPEG +n03529860_7535.JPEG +n02088238_11633.JPEG +n01807496_18405.JPEG +n03133878_13628.JPEG +n03874293_13384.JPEG +n02099712_7603.JPEG +n04037443_4153.JPEG +n12267677_36594.JPEG +n04090263_3521.JPEG +n01828970_6088.JPEG +n07873807_16419.JPEG +n02259212_1810.JPEG +n02110063_16375.JPEG +n02111277_38336.JPEG +n01534433_11302.JPEG +n04487081_3537.JPEG +n04328186_15415.JPEG +n04462240_15474.JPEG +n02113978_2337.JPEG +n02777292_20016.JPEG +n02097209_8263.JPEG +n07615774_5674.JPEG +n02128757_4232.JPEG +n03016953_24483.JPEG +n03995372_18133.JPEG +n03888605_35194.JPEG +n02091134_4045.JPEG +n03903868_28578.JPEG +n02490219_1208.JPEG +n02916936_4285.JPEG +n02481823_17587.JPEG +n12768682_24428.JPEG +n03777568_8550.JPEG +n01917289_2924.JPEG +n02640242_41575.JPEG +n03388183_5664.JPEG +n04330267_13496.JPEG +n04040759_5230.JPEG +n02206856_2666.JPEG +n04389033_16764.JPEG +n03444034_3530.JPEG +n04442312_12322.JPEG +n07753275_833.JPEG +n03126707_16289.JPEG +n03998194_9952.JPEG +n03983396_12881.JPEG +n03201208_18939.JPEG +n03796401_15942.JPEG +n04311004_3654.JPEG +n03877472_35944.JPEG +n02134084_5957.JPEG +n02172182_7483.JPEG +n01807496_28363.JPEG +n03710721_29138.JPEG +n02640242_498.JPEG +n04532106_12946.JPEG +n01728572_23467.JPEG +n04254680_7451.JPEG +n01784675_4143.JPEG +n04179913_14345.JPEG +n03089624_34931.JPEG +n02906734_3427.JPEG +n04371430_132.JPEG +n02097658_2941.JPEG +n09193705_1055.JPEG +n04270147_2366.JPEG +n02687172_4811.JPEG +n03272562_7953.JPEG +n03249569_24608.JPEG +n02317335_9436.JPEG +n04037443_34056.JPEG +n01860187_3329.JPEG +n04228054_462.JPEG +n02106382_2094.JPEG +n04404412_4938.JPEG +n02319095_4702.JPEG +n03495258_2056.JPEG +n02825657_1180.JPEG +n02114855_10617.JPEG +n04428191_23543.JPEG +n03000247_16203.JPEG +n03770439_12541.JPEG +n02794156_22894.JPEG +n04501370_241.JPEG +n02526121_24872.JPEG +n13040303_9233.JPEG +n03337140_19525.JPEG +n01847000_27969.JPEG +n04275548_12378.JPEG +n03400231_22627.JPEG +n02747177_7026.JPEG +n03887697_12403.JPEG +n02835271_17695.JPEG +n01689811_10488.JPEG +n04264628_5529.JPEG +n07802026_2142.JPEG +n03134739_13509.JPEG +n03938244_5717.JPEG +n03961711_11798.JPEG +n02085782_8538.JPEG +n02085782_8096.JPEG +n12768682_58.JPEG +n01729977_7568.JPEG +n03983396_2166.JPEG +n13133613_51681.JPEG +n02226429_1339.JPEG +n03891332_5982.JPEG +n01882714_9603.JPEG +n07693725_13992.JPEG +n01677366_9451.JPEG +n02977058_29218.JPEG +n02113799_1010.JPEG +n02730930_4943.JPEG +n06874185_1129.JPEG +n04153751_39235.JPEG +n02817516_8960.JPEG +n07880968_3557.JPEG +n04376876_27779.JPEG +n03063599_1619.JPEG +n01980166_5304.JPEG +n01806567_9243.JPEG +n02104029_4557.JPEG +n02321529_6027.JPEG +n03476684_661.JPEG +n03785016_869.JPEG +n01514668_43127.JPEG +n03355925_17145.JPEG +n02093256_13357.JPEG +n02749479_6333.JPEG +n01843065_11460.JPEG +n12144580_15261.JPEG +n02094258_655.JPEG +n04326547_1024.JPEG +n03291819_65652.JPEG +n04120489_5092.JPEG +n04591157_7276.JPEG +n02096177_3931.JPEG +n07584110_16357.JPEG +n02108551_11016.JPEG +n01630670_633.JPEG +n07930864_54707.JPEG +n03724870_9494.JPEG +n01773157_5630.JPEG +n12768682_29785.JPEG +n03840681_8859.JPEG +n07584110_9981.JPEG +n03899768_97315.JPEG +n01806567_21429.JPEG +n02011460_10853.JPEG +n01496331_12116.JPEG +n04479046_18462.JPEG +n03447447_1132.JPEG +n04462240_8354.JPEG +n01682714_3427.JPEG +n02787622_2843.JPEG +n02074367_23127.JPEG +n02276258_1309.JPEG +n03207941_17907.JPEG +n12144580_10871.JPEG +n02105056_12599.JPEG +n04548362_2490.JPEG +n02834397_21743.JPEG +n02107312_3456.JPEG +n03796401_3208.JPEG +n04133789_12954.JPEG +n03967562_30236.JPEG +n03690938_11109.JPEG +n02051845_14794.JPEG +n02093991_5378.JPEG +n01817953_1137.JPEG +n02493793_999.JPEG +n04332243_29306.JPEG +n02328150_4834.JPEG +n01855032_6744.JPEG +n02807133_2822.JPEG +n04296562_39708.JPEG +n03598930_9597.JPEG +n02793495_13581.JPEG +n02655020_10495.JPEG +n04589890_8461.JPEG +n01737021_25233.JPEG +n03376595_302.JPEG +n02113712_16447.JPEG +n02093859_40.JPEG +n04355933_3454.JPEG +n02669723_4283.JPEG +n01872401_1447.JPEG +n09256479_1556.JPEG +n03977966_71433.JPEG +n02093754_5451.JPEG +n01744401_15114.JPEG +n02110063_5507.JPEG +n07873807_2729.JPEG +n03445777_13490.JPEG +n02268853_6053.JPEG +n02747177_31042.JPEG +n04336792_10703.JPEG +n07875152_4603.JPEG +n01773797_6472.JPEG +n02966193_36459.JPEG +n02088364_6092.JPEG +n01774750_703.JPEG +n04039381_1017.JPEG +n02111129_7065.JPEG +n02870880_16890.JPEG +n02109047_4313.JPEG +n04229816_13111.JPEG +n01980166_1391.JPEG +n04005630_49493.JPEG +n02797295_13903.JPEG +n04346328_20904.JPEG +n04371774_15894.JPEG +n11879895_4821.JPEG +n02279972_9408.JPEG +n03658185_9099.JPEG +n01695060_15335.JPEG +n13054560_5360.JPEG +n02791270_17568.JPEG +n03956157_27182.JPEG +n02107908_1344.JPEG +n02110958_791.JPEG +n07716358_40733.JPEG +n02137549_9433.JPEG +n02870880_17483.JPEG +n01773157_9410.JPEG +n02326432_14758.JPEG +n02480495_20609.JPEG +n07753113_23878.JPEG +n07742313_21550.JPEG +n01632777_6196.JPEG +n04355933_6032.JPEG +n13044778_5468.JPEG +n02231487_2429.JPEG +n03376595_11231.JPEG +n02927161_17739.JPEG +n02948072_10064.JPEG +n03594734_38108.JPEG +n02099267_6272.JPEG +n03000247_35649.JPEG +n07714571_8346.JPEG +n01496331_17007.JPEG +n03777568_3849.JPEG +n06359193_8464.JPEG +n02168699_7589.JPEG +n07742313_2773.JPEG +n02988304_8736.JPEG +n02895154_31601.JPEG +n03982430_28773.JPEG +n02412080_5155.JPEG +n03786901_6314.JPEG +n02092002_2074.JPEG +n03759954_12721.JPEG +n03961711_3407.JPEG +n03485407_3097.JPEG +n07584110_2328.JPEG +n04065272_1663.JPEG +n03482405_5911.JPEG +n02114367_16767.JPEG +n02098286_3842.JPEG +n02110185_9607.JPEG +n04355933_1391.JPEG +n02105855_15650.JPEG +n01582220_9053.JPEG +n02088094_12861.JPEG +n02110063_12462.JPEG +n02120079_23405.JPEG +n03633091_14220.JPEG +n03131574_9999.JPEG +n03125729_16186.JPEG +n03874599_12251.JPEG +n04152593_2018.JPEG +n01980166_3536.JPEG +n01877812_2701.JPEG +n04372370_14857.JPEG +n02091635_3503.JPEG +n02114548_8682.JPEG +n02782093_2985.JPEG +n03534580_3463.JPEG +n04286575_21179.JPEG +n04591157_2685.JPEG +n03476991_27328.JPEG +n04008634_6540.JPEG +n02088466_2411.JPEG +n07753113_6439.JPEG +n01773797_6202.JPEG +n03527444_1159.JPEG +n02437616_13895.JPEG +n04344873_5828.JPEG +n02672831_15267.JPEG +n01737021_6929.JPEG +n03841143_5657.JPEG +n02408429_5860.JPEG +n02823428_3923.JPEG +n02096177_9334.JPEG +n02410509_8199.JPEG +n04277352_5336.JPEG +n03594734_38101.JPEG +n02129165_1022.JPEG +n02457408_2264.JPEG +n01833805_10058.JPEG +n02134084_27458.JPEG +n03992509_6518.JPEG +n02233338_2822.JPEG +n04417672_2810.JPEG +n03028079_14885.JPEG +n02454379_2313.JPEG +n02086079_18586.JPEG +n02112018_12495.JPEG +n02486410_5174.JPEG +n01622779_1478.JPEG +n02865351_6197.JPEG +n02102973_2759.JPEG +n02102040_5756.JPEG +n02007558_54241.JPEG +n04192698_8645.JPEG +n03710721_3791.JPEG +n04026417_6487.JPEG +n07892512_2406.JPEG +n03733281_22964.JPEG +n03530642_5976.JPEG +n02497673_7927.JPEG +n03297495_1100.JPEG +n02190166_6749.JPEG +n03124170_9715.JPEG +n03788195_8034.JPEG +n01443537_10176.JPEG +n04346328_1479.JPEG +n02018795_5460.JPEG +n02483362_4375.JPEG +n01669191_5949.JPEG +n07875152_1327.JPEG +n03271574_3769.JPEG +n02033041_5963.JPEG +n03876231_14583.JPEG +n02091635_1671.JPEG +n03717622_11932.JPEG +n04252077_767.JPEG +n02107908_10530.JPEG +n12620546_14054.JPEG +n02134084_342.JPEG +n03467068_9872.JPEG +n02777292_6968.JPEG +n03998194_11447.JPEG +n03379051_2452.JPEG +n04554684_11795.JPEG +n11879895_3555.JPEG +n03124170_5654.JPEG +n02966687_5181.JPEG +n12620546_12512.JPEG +n02363005_18802.JPEG +n03498962_6062.JPEG +n02219486_30086.JPEG +n07836838_27153.JPEG +n03445777_10743.JPEG +n02165105_85.JPEG +n02130308_7746.JPEG +n02493793_71.JPEG +n07614500_136.JPEG +n04523525_6503.JPEG +n02088094_4683.JPEG +n01748264_7606.JPEG +n03485407_2262.JPEG +n01667778_5834.JPEG +n04523525_50453.JPEG +n02115913_13327.JPEG +n03888605_25009.JPEG +n01978455_3225.JPEG +n04310018_12441.JPEG +n07711569_4434.JPEG +n02489166_6859.JPEG +n03680355_13665.JPEG +n04517823_1642.JPEG +n02356798_235.JPEG +n03680355_3984.JPEG +n02095570_8200.JPEG +n03706229_9644.JPEG +n03127747_7712.JPEG +n02708093_6631.JPEG +n01983481_11196.JPEG +n02815834_4015.JPEG +n04389033_27059.JPEG +n03908618_1602.JPEG +n01755581_84.JPEG +n03109150_26060.JPEG +n01806143_13820.JPEG +n02837789_24047.JPEG +n01742172_12519.JPEG +n09288635_3905.JPEG +n01983481_13378.JPEG +n02091244_4644.JPEG +n04317175_12849.JPEG +n02099712_388.JPEG +n02112706_2391.JPEG +n04532670_7636.JPEG +n02281406_16312.JPEG +n03457902_6713.JPEG +n03590841_4901.JPEG +n01798484_9563.JPEG +n07880968_7456.JPEG +n03249569_39369.JPEG +n04039381_4160.JPEG +n02437312_6727.JPEG +n03995372_1913.JPEG +n02536864_2349.JPEG +n04548362_52873.JPEG +n02102480_333.JPEG +n04435653_8923.JPEG +n03841143_29209.JPEG +n01688243_1361.JPEG +n02134418_102.JPEG +n02701002_21229.JPEG +n03729826_2362.JPEG +n03065424_11661.JPEG +n04509417_2604.JPEG +n01774750_6064.JPEG +n02088238_2948.JPEG +n02799071_12822.JPEG +n03770679_6837.JPEG +n04553703_20836.JPEG +n02174001_459.JPEG +n04429376_8355.JPEG +n02093991_2676.JPEG +n04476259_7223.JPEG +n02666196_6372.JPEG +n03216828_47429.JPEG +n02992529_60072.JPEG +n04409515_19893.JPEG +n02106030_9240.JPEG +n02687172_2470.JPEG +n01955084_7168.JPEG +n01818515_6834.JPEG +n02093256_70.JPEG +n04599235_45519.JPEG +n03733131_6288.JPEG +n03976657_15265.JPEG +n09421951_5389.JPEG +n03967562_15200.JPEG +n02834397_8710.JPEG +n02100877_18684.JPEG +n07590611_23331.JPEG +n01883070_8556.JPEG +n03297495_2309.JPEG +n01914609_18559.JPEG +n02802426_8514.JPEG +n03884397_17377.JPEG +n03924679_3379.JPEG +n02172182_6612.JPEG +n07760859_8032.JPEG +n03459775_10103.JPEG +n03133878_8603.JPEG +n01742172_20431.JPEG +n01531178_15799.JPEG +n02443484_3387.JPEG +n03977966_72696.JPEG +n01855672_4646.JPEG +n03216828_1276.JPEG +n03028079_6372.JPEG +n02106662_98117.JPEG +n01632458_6029.JPEG +n03216828_7227.JPEG +n02115641_26349.JPEG +n02395406_4683.JPEG +n04552348_12278.JPEG +n03874599_1271.JPEG +n02102318_6894.JPEG +n04493381_6279.JPEG +n03478589_17913.JPEG +n02441942_23951.JPEG +n03376595_52.JPEG +n02099267_5342.JPEG +n02356798_648.JPEG +n03355925_24047.JPEG +n07693725_8181.JPEG +n02108089_11122.JPEG +n03379051_8478.JPEG +n01440764_7230.JPEG +n02002724_18994.JPEG +n04131690_7034.JPEG +n03947888_9544.JPEG +n04111531_7574.JPEG +n03290653_2543.JPEG +n03796401_26126.JPEG +n04118776_6239.JPEG +n03733805_5.JPEG +n02415577_537.JPEG +n04328186_15764.JPEG +n02704792_20685.JPEG +n02641379_9264.JPEG +n04039381_10957.JPEG +n04229816_12998.JPEG +n03792782_7773.JPEG +n02422106_3491.JPEG +n04074963_31994.JPEG +n01806567_16258.JPEG +n02009912_20199.JPEG +n01983481_19153.JPEG +n02930766_4849.JPEG +n02086240_12893.JPEG +n01798484_12651.JPEG +n02111277_41565.JPEG +n04355933_3181.JPEG +n01807496_7365.JPEG +n02108422_1555.JPEG +n02870880_1404.JPEG +n02437616_411.JPEG +n10148035_24712.JPEG +n02133161_8469.JPEG +n03930313_15211.JPEG +n02112706_3199.JPEG +n02090721_2131.JPEG +n07720875_8804.JPEG +n02116738_36132.JPEG +n02965783_7169.JPEG +n04548362_34025.JPEG +n04252225_2941.JPEG +n03062245_11780.JPEG +n04235860_12.JPEG +n01580077_7680.JPEG +n02490219_3651.JPEG +n02074367_2966.JPEG +n01695060_23744.JPEG +n03476991_19005.JPEG +n03179701_8575.JPEG +n04310018_7952.JPEG +n04008634_24680.JPEG +n02127052_7487.JPEG +n01558993_9763.JPEG +n03891332_3184.JPEG +n02088632_4435.JPEG +n02110627_19146.JPEG +n03594734_31568.JPEG +n02837789_19120.JPEG +n02093991_7437.JPEG +n02095889_7319.JPEG +n02086079_28775.JPEG +n02825657_10332.JPEG +n04252077_4937.JPEG +n03866082_5845.JPEG +n04090263_5438.JPEG +n07742313_15431.JPEG +n02346627_14333.JPEG +n01740131_13726.JPEG +n02106382_778.JPEG +n03782006_42578.JPEG +n03710721_19494.JPEG +n03028079_36351.JPEG +n02676566_1646.JPEG +n02105056_14753.JPEG +n04493381_27386.JPEG +n02112018_5670.JPEG +n03160309_12931.JPEG +n02808440_4508.JPEG +n03207743_8471.JPEG +n03877845_8827.JPEG +n04346328_11831.JPEG +n03733131_100.JPEG +n02106166_785.JPEG +n02500267_14620.JPEG +n02007558_1044.JPEG +n02782093_4250.JPEG +n03100240_7458.JPEG +n01675722_4311.JPEG +n03782006_4488.JPEG +n01817953_1962.JPEG +n02226429_25117.JPEG +n04026417_8872.JPEG +n03840681_4697.JPEG +n02090721_4433.JPEG +n02454379_2754.JPEG +n02100735_3111.JPEG +n02892767_3647.JPEG +n01990800_8832.JPEG +n01669191_1038.JPEG +n07920052_17661.JPEG +n04069434_17218.JPEG +n03394916_38515.JPEG +n04370456_11558.JPEG +n01748264_7490.JPEG +n02169497_3864.JPEG +n01981276_11422.JPEG +n02086240_10653.JPEG +n04204347_5.JPEG +n02834397_8907.JPEG +n02980441_38844.JPEG +n04409515_2265.JPEG +n03400231_14838.JPEG +n02109961_62366.JPEG +n02099429_4023.JPEG +n07749582_14734.JPEG +n04596742_25703.JPEG +n03942813_11112.JPEG +n01704323_628.JPEG +n02483362_1270.JPEG +n01530575_10236.JPEG +n02100735_2695.JPEG +n02132136_24002.JPEG +n02090379_4824.JPEG +n07871810_15091.JPEG +n02091467_3399.JPEG +n02017213_4349.JPEG +n01784675_3401.JPEG +n02226429_14629.JPEG +n02088632_7522.JPEG +n04487081_34796.JPEG +n03089624_26183.JPEG +n02105855_18571.JPEG +n02108422_3211.JPEG +n02444819_5117.JPEG +n02108551_12521.JPEG +n01632777_1883.JPEG +n03478589_7223.JPEG +n02892201_5567.JPEG +n04209239_3816.JPEG +n02066245_8252.JPEG +n02442845_7920.JPEG +n04133789_3960.JPEG +n03445777_2511.JPEG +n02640242_728.JPEG +n02906734_8281.JPEG +n03873416_5591.JPEG +n04350905_1297.JPEG +n04562935_2338.JPEG +n02408429_5476.JPEG +n04286575_26544.JPEG +n03961711_20754.JPEG +n02096437_750.JPEG +n03417042_4292.JPEG +n02999410_9968.JPEG +n03424325_27369.JPEG +n02883205_1642.JPEG +n04285008_6087.JPEG +n04515003_15985.JPEG +n02128757_1410.JPEG +n07749582_20553.JPEG +n03388549_2755.JPEG +n03937543_853.JPEG +n03770439_25045.JPEG +n03673027_256.JPEG +n02981792_13990.JPEG +n01985128_11050.JPEG +n03485407_15225.JPEG +n03983396_16397.JPEG +n03776460_14344.JPEG +n02974003_4071.JPEG +n02794156_6127.JPEG +n03770679_2628.JPEG +n01807496_7464.JPEG +n03290653_4598.JPEG +n04118776_51187.JPEG +n01914609_763.JPEG +n03443371_15721.JPEG +n02123045_5123.JPEG +n02138441_4429.JPEG +n04462240_19930.JPEG +n03459775_3086.JPEG +n03825788_19306.JPEG +n02389026_9203.JPEG +n02105505_7633.JPEG +n07730033_8950.JPEG +n02088632_5483.JPEG +n03854065_70257.JPEG +n02280649_7696.JPEG +n04266014_10231.JPEG +n04525305_10352.JPEG +n04409515_21212.JPEG +n02909870_22481.JPEG +n03393912_4031.JPEG +n03388183_20829.JPEG +n10148035_14273.JPEG +n01776313_19947.JPEG +n02190166_1046.JPEG +n03467068_330.JPEG +n12620546_61955.JPEG +n03062245_16219.JPEG +n01883070_6221.JPEG +n01751748_9226.JPEG +n04590129_1162.JPEG +n03976467_2425.JPEG +n04296562_93438.JPEG +n02264363_3450.JPEG +n01833805_151.JPEG +n02877765_4915.JPEG +n03014705_5986.JPEG +n04147183_20770.JPEG +n02443484_1864.JPEG +n02988304_17578.JPEG +n02071294_6284.JPEG +n01689811_3103.JPEG +n01685808_5276.JPEG +n02226429_8535.JPEG +n02859443_3862.JPEG +n01677366_43167.JPEG +n03598930_7154.JPEG +n02687172_54223.JPEG +n01614925_13114.JPEG +n02346627_21577.JPEG +n01990800_7342.JPEG +n01518878_14617.JPEG +n04229816_14170.JPEG +n04037443_25929.JPEG +n01944390_1469.JPEG +n02971356_11182.JPEG +n02091032_7230.JPEG +n02526121_10347.JPEG +n04461696_18701.JPEG +n03394916_51571.JPEG +n02002556_4710.JPEG +n04467665_63281.JPEG +n02099429_3090.JPEG +n01675722_636.JPEG +n02108915_241.JPEG +n03888605_33119.JPEG +n02655020_42075.JPEG +n02892767_822.JPEG +n03461385_36406.JPEG +n03785016_8670.JPEG +n07717410_8434.JPEG +n03372029_4260.JPEG +n02951358_1240.JPEG +n02112137_3570.JPEG +n01914609_8031.JPEG +n03109150_26285.JPEG +n04562935_7651.JPEG +n07714571_12498.JPEG +n02007558_10404.JPEG +n02395406_10463.JPEG +n04259630_5761.JPEG +n02256656_12400.JPEG +n02077923_6800.JPEG +n03538406_748.JPEG +n04584207_2851.JPEG +n03075370_10311.JPEG +n01924916_7065.JPEG +n04149813_16050.JPEG +n02123597_11852.JPEG +n07754684_18726.JPEG +n03146219_11904.JPEG +n02089973_1324.JPEG +n03902125_1243.JPEG +n03793489_3066.JPEG +n01622779_5410.JPEG +n02514041_14897.JPEG +n03207743_9174.JPEG +n03250847_21301.JPEG +n01824575_1970.JPEG +n07717410_2817.JPEG +n03450230_16985.JPEG +n03691459_1413.JPEG +n04162706_18707.JPEG +n07892512_15645.JPEG +n02002556_5552.JPEG +n01985128_21857.JPEG +n02493509_9235.JPEG +n02676566_8192.JPEG +n03920288_3631.JPEG +n07930864_3435.JPEG +n02667093_4913.JPEG +n02799071_11545.JPEG +n02319095_3879.JPEG +n02701002_2154.JPEG +n04263257_2769.JPEG +n13052670_5318.JPEG +n02281787_4327.JPEG +n02108000_7497.JPEG +n02229544_3188.JPEG +n03259280_11567.JPEG +n02927161_9677.JPEG +n03379051_6624.JPEG +n03792972_2683.JPEG +n03843555_72.JPEG +n03929855_6859.JPEG +n02391049_343.JPEG +n02883205_21414.JPEG +n01755581_12928.JPEG +n03637318_8228.JPEG +n02488291_1793.JPEG +n04069434_7374.JPEG +n02860847_13468.JPEG +n03782006_12089.JPEG +n01990800_6375.JPEG +n04149813_5352.JPEG +n02099712_6297.JPEG +n04552348_8018.JPEG +n09193705_19713.JPEG +n02325366_6030.JPEG +n07717556_4145.JPEG +n07583066_1387.JPEG +n01944390_6724.JPEG +n03584829_8811.JPEG +n02117135_12810.JPEG +n02444819_2148.JPEG +n01608432_1098.JPEG +n01677366_10388.JPEG +n03476684_11107.JPEG +n02093647_3666.JPEG +n02457408_4096.JPEG +n02113624_5195.JPEG +n07614500_9642.JPEG +n02099267_11333.JPEG +n04485082_14042.JPEG +n03691459_6769.JPEG +n02119022_17284.JPEG +n02804610_19013.JPEG +n01728572_1647.JPEG +n03272010_6746.JPEG +n01580077_2452.JPEG +n02090721_5373.JPEG +n03717622_3690.JPEG +n03063689_9738.JPEG +n03594734_16848.JPEG +n04125021_25773.JPEG +n01608432_992.JPEG +n12985857_3565.JPEG +n01728920_2299.JPEG +n01773157_3508.JPEG +n02268443_38367.JPEG +n07583066_26542.JPEG +n02489166_10944.JPEG +n02747177_17795.JPEG +n02018795_4340.JPEG +n03888257_34666.JPEG +n13054560_352.JPEG +n04141975_28633.JPEG +n03930630_2636.JPEG +n04606251_13386.JPEG +n04505470_2889.JPEG +n07747607_3480.JPEG +n02916936_3407.JPEG +n03126707_4706.JPEG +n03733131_1930.JPEG +n01665541_12952.JPEG +n01820546_5866.JPEG +n03404251_5793.JPEG +n04540053_1832.JPEG +n04264628_10565.JPEG +n02328150_2335.JPEG +n03630383_6670.JPEG +n03388549_1232.JPEG +n02177972_878.JPEG +n02786058_11271.JPEG +n03895866_55178.JPEG +n04204238_6548.JPEG +n01664065_1420.JPEG +n04417672_10122.JPEG +n04557648_4151.JPEG +n02119789_10540.JPEG +n01855672_10962.JPEG +n01443537_11165.JPEG +n09421951_14307.JPEG +n02089973_2457.JPEG +n03529860_3292.JPEG +n02094433_2729.JPEG +n03481172_11112.JPEG +n07715103_368.JPEG +n02447366_21076.JPEG +n07930864_37744.JPEG +n07836838_3385.JPEG +n03218198_6514.JPEG +n04366367_2635.JPEG +n04442312_15493.JPEG +n04330267_21397.JPEG +n04326547_20131.JPEG +n04525038_9200.JPEG +n02699494_44334.JPEG +n02119789_4078.JPEG +n02480495_24251.JPEG +n02058221_11790.JPEG +n02090379_4875.JPEG +n03599486_12852.JPEG +n02085782_866.JPEG +n02071294_9742.JPEG +n04428191_21169.JPEG +n02107683_3667.JPEG +n03709823_18362.JPEG +n03188531_6269.JPEG +n04317175_9765.JPEG +n03662601_10541.JPEG +n01914609_10595.JPEG +n02100735_718.JPEG +n04370456_2282.JPEG +n02098286_2394.JPEG +n03447447_5159.JPEG +n03662601_8065.JPEG +n04350905_44695.JPEG +n01641577_5821.JPEG +n04458633_7008.JPEG +n03788365_5698.JPEG +n03873416_4884.JPEG +n02514041_7057.JPEG +n04443257_6169.JPEG +n02114855_17066.JPEG +n02492035_7837.JPEG +n03388043_3092.JPEG +n02979186_2548.JPEG +n04465501_887.JPEG +n03595614_6288.JPEG +n03929660_12193.JPEG +n03085013_23843.JPEG +n02397096_10.JPEG +n03447721_7168.JPEG +n03832673_10632.JPEG +n02113799_5060.JPEG +n02165105_305.JPEG +n02794156_9681.JPEG +n04523525_5317.JPEG +n03729826_18668.JPEG +n04355338_28792.JPEG +n13044778_11678.JPEG +n01440764_9609.JPEG +n02087394_14708.JPEG +n02099429_2240.JPEG +n02105505_5565.JPEG +n03908618_11417.JPEG +n02086240_402.JPEG +n04447861_4075.JPEG +n02823428_7704.JPEG +n02115913_9465.JPEG +n03314780_1506.JPEG +n04019541_42764.JPEG +n02104029_1313.JPEG +n03956157_1014.JPEG +n03724870_9497.JPEG +n03527444_3733.JPEG +n02091467_9362.JPEG +n01694178_595.JPEG +n02097047_255.JPEG +n04208210_7968.JPEG +n04579145_3432.JPEG +n03776460_3354.JPEG +n03461385_96913.JPEG +n02442845_9686.JPEG +n07930864_5304.JPEG +n01944390_8726.JPEG +n03785016_2203.JPEG +n03255030_9026.JPEG +n15075141_19116.JPEG +n02111129_7921.JPEG +n02655020_11093.JPEG +n02396427_1744.JPEG +n02129604_10207.JPEG +n04579432_11428.JPEG +n02111500_4991.JPEG +n04467665_66047.JPEG +n02066245_9679.JPEG +n03447721_20388.JPEG +n04336792_7762.JPEG +n12057211_828.JPEG +n03388043_15689.JPEG +n03201208_27939.JPEG +n04522168_9016.JPEG +n02727426_16941.JPEG +n01744401_1498.JPEG +n02206856_7696.JPEG +n02120079_12626.JPEG +n03240683_10579.JPEG +n02100735_5228.JPEG +n03255030_3208.JPEG +n03290653_10414.JPEG +n04040759_27236.JPEG +n04579432_33599.JPEG +n02869837_1496.JPEG +n04209239_8865.JPEG +n03916031_7908.JPEG +n02109047_8714.JPEG +n02403003_4330.JPEG +n03874599_9400.JPEG +n02877765_11944.JPEG +n03452741_4860.JPEG +n02398521_33459.JPEG +n02395406_73196.JPEG +n03666591_12917.JPEG +n04081281_59830.JPEG +n03733805_3212.JPEG +n04286575_48245.JPEG +n03250847_3798.JPEG +n04141327_5280.JPEG +n02102480_8453.JPEG +n02640242_41393.JPEG +n03041632_2386.JPEG +n02667093_9057.JPEG +n03141823_9807.JPEG +n01917289_2337.JPEG +n02190166_8176.JPEG +n09229709_32797.JPEG +n03216828_54822.JPEG +n03929855_7106.JPEG +n03041632_3171.JPEG +n03272562_2.JPEG +n02326432_376.JPEG +n01682714_3277.JPEG +n02971356_405.JPEG +n03134739_6512.JPEG +n04154565_19474.JPEG +n02105412_1796.JPEG +n03777568_6286.JPEG +n01917289_5352.JPEG +n03134739_167.JPEG +n02437312_2640.JPEG +n01667778_2594.JPEG +n02104029_2442.JPEG +n10148035_19891.JPEG +n03769881_6865.JPEG +n03920288_16.JPEG +n02281787_5359.JPEG +n02112350_6242.JPEG +n04476259_17769.JPEG +n02815834_8639.JPEG +n01689811_227.JPEG +n02487347_2495.JPEG +n04372370_42614.JPEG +n04548280_8354.JPEG +n03840681_4564.JPEG +n06785654_878.JPEG +n04254120_2995.JPEG +n07932039_607.JPEG +n01742172_12928.JPEG +n01558993_8876.JPEG +n03733805_3344.JPEG +n02009912_1218.JPEG +n02749479_9771.JPEG +n04347754_74283.JPEG +n03180011_10058.JPEG +n02111500_4651.JPEG +n04208210_15231.JPEG +n02091831_1663.JPEG +n04153751_23777.JPEG +n13052670_4997.JPEG +n01930112_11681.JPEG +n02802426_1154.JPEG +n07860988_10367.JPEG +n02101006_12842.JPEG +n04026417_35015.JPEG +n02979186_10546.JPEG +n03424325_8313.JPEG +n04532670_18998.JPEG +n03743016_7269.JPEG +n04461696_26455.JPEG +n02676566_9079.JPEG +n03379051_6882.JPEG +n03792972_5622.JPEG +n02169497_3747.JPEG +n04355933_15778.JPEG +n04275548_3680.JPEG +n03483316_1703.JPEG +n03710637_18244.JPEG +n04507155_2679.JPEG +n02095570_11202.JPEG +n02277742_2229.JPEG +n03661043_14287.JPEG +n03637318_28059.JPEG +n01687978_60.JPEG +n02259212_2595.JPEG +n04147183_22248.JPEG +n01755581_9980.JPEG +n02096585_6634.JPEG +n03218198_10440.JPEG +n03344393_9732.JPEG +n01950731_15875.JPEG +n07613480_6417.JPEG +n07753592_10356.JPEG +n02107312_6269.JPEG +n03916031_12521.JPEG +n02397096_8335.JPEG +n04040759_189.JPEG +n01978455_11509.JPEG +n03720891_3482.JPEG +n01664065_33898.JPEG +n03017168_47946.JPEG +n02815834_4929.JPEG +n02071294_44704.JPEG +n02841315_1508.JPEG +n02113023_9450.JPEG +n02190166_1725.JPEG +n02089973_313.JPEG +n03481172_28550.JPEG +n04263257_17671.JPEG +n02100735_270.JPEG +n02123597_2597.JPEG +n07613480_10847.JPEG +n07697537_1592.JPEG +n02536864_16016.JPEG +n02123597_1516.JPEG +n12985857_3854.JPEG +n03290653_2275.JPEG +n02098413_3091.JPEG +n02102040_1292.JPEG +n01930112_704.JPEG +n01774750_9042.JPEG +n02106662_19506.JPEG +n02280649_8384.JPEG +n02093754_6406.JPEG +n01739381_5219.JPEG +n01847000_15454.JPEG +n03124170_7233.JPEG +n04254120_3667.JPEG +n09288635_1122.JPEG +n03908714_4683.JPEG +n03617480_17799.JPEG +n01877812_4061.JPEG +n03394916_34129.JPEG +n02111500_5579.JPEG +n07714571_4297.JPEG +n01843383_263.JPEG +n04591157_1934.JPEG +n02111277_17163.JPEG +n03840681_21142.JPEG +n04200800_8644.JPEG +n02088364_12322.JPEG +n02099712_8097.JPEG +n03026506_6899.JPEG +n02727426_23370.JPEG +n07871810_9713.JPEG +n04070727_5917.JPEG +n03223299_8959.JPEG +n03742115_291.JPEG +n02106662_59021.JPEG +n02109961_12760.JPEG +n02457408_8272.JPEG +n04584207_13806.JPEG +n03874293_14397.JPEG +n04335435_15934.JPEG +n04591157_5170.JPEG +n03866082_1980.JPEG +n03496892_660.JPEG +n03527444_10537.JPEG +n04447861_3111.JPEG +n02951585_1100.JPEG +n03956157_14737.JPEG +n02099849_2314.JPEG +n02110063_17399.JPEG +n03444034_7969.JPEG +n02090622_5607.JPEG +n03657121_11230.JPEG +n03884397_5303.JPEG +n03208938_1161.JPEG +n07930864_6613.JPEG +n03325584_2271.JPEG +n02094114_3565.JPEG +n02454379_31126.JPEG +n01737021_7125.JPEG +n02099267_2473.JPEG +n02730930_1655.JPEG +n03857828_28603.JPEG +n03444034_4754.JPEG +n12768682_35252.JPEG +n03773504_14369.JPEG +n04235860_6538.JPEG +n02930766_34076.JPEG +n02487347_10489.JPEG +n04252225_9233.JPEG +n04443257_18349.JPEG +n02794156_6795.JPEG +n02840245_5155.JPEG +n15075141_28529.JPEG +n04485082_4004.JPEG +n02099267_2222.JPEG +n02510455_3799.JPEG +n02363005_4279.JPEG +n03417042_27017.JPEG +n02090379_5600.JPEG +n01748264_3442.JPEG +n12057211_1314.JPEG +n02950826_17826.JPEG +n02980441_18503.JPEG +n03394916_38223.JPEG +n03721384_20472.JPEG +n04074963_10111.JPEG +n02493793_9669.JPEG +n02497673_1426.JPEG +n04392985_14523.JPEG +n03452741_3682.JPEG +n03590841_6046.JPEG +n09288635_13374.JPEG +n02028035_6711.JPEG +n02108000_2218.JPEG +n02092002_14831.JPEG +n03792972_6130.JPEG +n02417914_7648.JPEG +n02229544_595.JPEG +n04596742_5111.JPEG +n02641379_36016.JPEG +n03127925_895.JPEG +n01641577_11586.JPEG +n02012849_12628.JPEG +n02963159_10378.JPEG +n07693725_6921.JPEG +n02094114_6391.JPEG +n04409515_1523.JPEG +n03991062_28633.JPEG +n02480495_118.JPEG +n03630383_8760.JPEG +n01582220_6764.JPEG +n03208938_4819.JPEG +n01496331_12885.JPEG +n02442845_12173.JPEG +n02206856_6335.JPEG +n03133878_4851.JPEG +n07768694_15607.JPEG +n03041632_30248.JPEG +n02236044_16810.JPEG +n04204238_858.JPEG +n01667114_2701.JPEG +n02965783_6456.JPEG +n02168699_5511.JPEG +n03100240_17336.JPEG +n07579787_7634.JPEG +n02096294_4688.JPEG +n03958227_7911.JPEG +n07720875_6237.JPEG +n02088466_9383.JPEG +n02988304_536.JPEG +n02607072_9418.JPEG +n02445715_34596.JPEG +n02100236_615.JPEG +n02124075_14197.JPEG +n01737021_13033.JPEG +n01514859_4031.JPEG +n04465501_556.JPEG +n02769748_31354.JPEG +n02281787_2341.JPEG +n03924679_7338.JPEG +n04081281_13212.JPEG +n07760859_388.JPEG +n03930630_14160.JPEG +n04356056_1764.JPEG +n02606052_23146.JPEG +n04540053_4230.JPEG +n03661043_24650.JPEG +n03160309_10005.JPEG +n02090622_7292.JPEG +n03729826_38574.JPEG +n01773157_10033.JPEG +n02110627_16885.JPEG +n04590129_17309.JPEG +n02497673_3487.JPEG +n03325584_41065.JPEG +n07880968_856.JPEG +n02364673_6465.JPEG +n03494278_29150.JPEG +n02092339_932.JPEG +n11879895_5983.JPEG +n03868863_12106.JPEG +n01682714_12947.JPEG +n01644373_15441.JPEG +n02094433_204.JPEG +n01630670_8686.JPEG +n02119789_12750.JPEG +n02093647_2786.JPEG +n02028035_16582.JPEG +n02133161_10179.JPEG +n02086240_4762.JPEG +n02667093_7387.JPEG +n04209239_3233.JPEG +n04540053_11412.JPEG +n01770081_4581.JPEG +n04325704_5366.JPEG +n03028079_9575.JPEG +n01484850_4471.JPEG +n02106382_9728.JPEG +n01748264_16681.JPEG +n03598930_19020.JPEG +n01532829_9020.JPEG +n02504013_4023.JPEG +n02101388_1465.JPEG +n04125021_17499.JPEG +n02280649_3232.JPEG +n02091467_5713.JPEG +n01737021_16132.JPEG +n02096585_2082.JPEG +n02091831_10198.JPEG +n04065272_7971.JPEG +n01877812_2645.JPEG +n02116738_7430.JPEG +n02480495_5778.JPEG +n02133161_1561.JPEG +n01797886_13048.JPEG +n01770393_8063.JPEG +n04238763_5122.JPEG +n02086240_5364.JPEG +n02099267_5245.JPEG +n09288635_12447.JPEG +n04525305_11958.JPEG +n01756291_9300.JPEG +n02860847_2961.JPEG +n02092002_9321.JPEG +n02093647_3954.JPEG +n02342885_2544.JPEG +n03240683_15018.JPEG +n04335435_4786.JPEG +n03877845_4195.JPEG +n03127925_9611.JPEG +n03991062_8628.JPEG +n03976467_3509.JPEG +n02006656_6392.JPEG +n04266014_490.JPEG +n01667778_3540.JPEG +n02091467_5176.JPEG +n03877845_14939.JPEG +n02091467_1315.JPEG +n04081281_13860.JPEG +n02137549_4638.JPEG +n07715103_6049.JPEG +n04008634_15378.JPEG +n02018795_1094.JPEG +n04049303_4525.JPEG +n03777754_8637.JPEG +n03223299_1307.JPEG +n02951358_30643.JPEG +n03459775_777.JPEG +n03992509_2831.JPEG +n04081281_19807.JPEG +n01744401_14591.JPEG +n03792972_665.JPEG +n03697007_10597.JPEG +n09229709_139709.JPEG +n02236044_5212.JPEG +n03538406_8356.JPEG +n02114548_15325.JPEG +n02797295_14562.JPEG +n01883070_21022.JPEG +n03290653_13827.JPEG +n01756291_11705.JPEG +n04562935_14115.JPEG +n12620546_17395.JPEG +n07716906_2510.JPEG +n02058221_38155.JPEG +n03188531_39995.JPEG +n03891332_8494.JPEG +n01795545_7082.JPEG +n02097298_10104.JPEG +n03854065_8159.JPEG +n02667093_3241.JPEG +n04589890_108.JPEG +n03042490_5904.JPEG +n01978455_11567.JPEG +n01981276_21580.JPEG +n03347037_9832.JPEG +n02487347_8876.JPEG +n04311004_695.JPEG +n03485794_37012.JPEG +n02536864_5403.JPEG +n03954731_182.JPEG +n01978455_9795.JPEG +n02130308_8606.JPEG +n02437616_3141.JPEG +n02097209_7269.JPEG +n02708093_3755.JPEG +n06596364_1467.JPEG +n07873807_2524.JPEG +n02504458_4259.JPEG +n02504013_3141.JPEG +n02101006_9205.JPEG +n04370456_3166.JPEG +n03240683_12608.JPEG +n07615774_5112.JPEG +n03372029_60046.JPEG +n02111277_3458.JPEG +n03450230_3686.JPEG +n03838899_26502.JPEG +n04428191_25319.JPEG +n04552348_24492.JPEG +n02927161_18612.JPEG +n02086646_72.JPEG +n02950826_10363.JPEG +n02112137_15407.JPEG +n04589890_9151.JPEG +n04019541_34063.JPEG +n02669723_1472.JPEG +n02088466_7191.JPEG +n02093991_3302.JPEG +n09428293_39474.JPEG +n03584254_1098.JPEG +n02823428_14224.JPEG +n02951358_5633.JPEG +n03888257_44925.JPEG +n02117135_3910.JPEG +n03028079_8531.JPEG +n02815834_1052.JPEG +n04125021_5242.JPEG +n03759954_11400.JPEG +n03146219_985.JPEG +n04136333_15812.JPEG +n03450230_24698.JPEG +n03223299_40453.JPEG +n03297495_4199.JPEG +n02417914_26143.JPEG +n02093859_3711.JPEG +n07747607_34025.JPEG +n02110185_12357.JPEG +n03720891_7260.JPEG +n03814639_12756.JPEG +n02783161_5807.JPEG +n02667093_576.JPEG +n02097474_410.JPEG +n03769881_4497.JPEG +n03047690_435.JPEG +n03825788_2019.JPEG +n02102973_5445.JPEG +n01774750_5952.JPEG +n02106662_75283.JPEG +n03944341_11616.JPEG +n04548280_5545.JPEG +n02814860_13017.JPEG +n03047690_30575.JPEG +n04133789_12919.JPEG +n02791124_12486.JPEG +n02104029_6843.JPEG +n01534433_1290.JPEG +n02782093_5270.JPEG +n03967562_25389.JPEG +n04069434_3701.JPEG +n04398044_9185.JPEG +n07718747_2853.JPEG +n03042490_10051.JPEG +n02137549_554.JPEG +n04486054_10398.JPEG +n01687978_1534.JPEG +n03787032_5157.JPEG +n02422699_3254.JPEG +n02167151_9966.JPEG +n02130308_12215.JPEG +n04350905_1795.JPEG +n04336792_7796.JPEG +n02869837_17288.JPEG +n01784675_4302.JPEG +n04252225_10033.JPEG +n04008634_16893.JPEG +n02012849_36329.JPEG +n02100236_1113.JPEG +n02676566_1736.JPEG +n02165456_8452.JPEG +n04251144_12624.JPEG +n03788365_8874.JPEG +n02102177_3817.JPEG +n12620546_14796.JPEG +n02966193_20099.JPEG +n03197337_4161.JPEG +n04263257_5144.JPEG +n02113978_5759.JPEG +n02325366_410.JPEG +n02879718_5460.JPEG +n03063689_9917.JPEG +n02804414_4151.JPEG +n02098413_263.JPEG +n01494475_16559.JPEG +n02098105_1264.JPEG +n02389026_17717.JPEG +n03935335_12808.JPEG +n02690373_9322.JPEG +n01796340_1335.JPEG +n02643566_3198.JPEG +n02094114_90.JPEG +n01704323_5752.JPEG +n02445715_30708.JPEG +n02110341_9631.JPEG +n02190166_101.JPEG +n01817953_7265.JPEG +n02091467_11919.JPEG +n02088632_6100.JPEG +n02124075_11203.JPEG +n03393912_8682.JPEG +n01983481_29477.JPEG +n04376876_15126.JPEG +n07584110_5765.JPEG +n02442845_25325.JPEG +n01665541_30058.JPEG +n02104365_9218.JPEG +n03598930_14182.JPEG +n03394916_47212.JPEG +n03793489_5324.JPEG +n03717622_2177.JPEG +n02487347_6070.JPEG +n01944390_11075.JPEG +n07875152_3235.JPEG +n01440764_12211.JPEG +n09193705_37139.JPEG +n02786058_12577.JPEG +n03690938_9486.JPEG +n03841143_2562.JPEG +n04332243_12988.JPEG +n04118538_4788.JPEG +n02128385_38726.JPEG +n07749582_7299.JPEG +n03379051_2176.JPEG +n04141975_1915.JPEG +n02093428_5001.JPEG +n01817953_4272.JPEG +n04479046_9122.JPEG +n04357314_5386.JPEG +n02704792_4235.JPEG +n10148035_16631.JPEG +n01704323_10791.JPEG +n03763968_967.JPEG +n04041544_17962.JPEG +n04423845_21117.JPEG +n01735189_20865.JPEG +n02666196_13447.JPEG +n02226429_12111.JPEG +n01784675_679.JPEG +n03026506_5683.JPEG +n04515003_8836.JPEG +n02795169_59383.JPEG +n03649909_5615.JPEG +n03498962_59241.JPEG +n03814906_26966.JPEG +n04525038_31492.JPEG +n04285008_3366.JPEG +n02825657_10765.JPEG +n03950228_12837.JPEG +n02108422_9188.JPEG +n03920288_261.JPEG +n04505470_1993.JPEG +n03950228_14470.JPEG +n02488702_1215.JPEG +n03188531_6171.JPEG +n04428191_6419.JPEG +n03018349_7425.JPEG +n02089867_7778.JPEG +n02398521_21000.JPEG +n12985857_6650.JPEG +n02087394_27612.JPEG +n03937543_7281.JPEG +n03877472_51404.JPEG +n04326547_19792.JPEG +n03769881_9382.JPEG +n04409515_12630.JPEG +n04154565_23965.JPEG +n03527444_14650.JPEG +n02092339_4948.JPEG +n02018795_13074.JPEG +n03983396_14652.JPEG +n04118538_6025.JPEG +n02444819_1567.JPEG +n01872401_14717.JPEG +n03759954_7933.JPEG +n03792782_17280.JPEG +n03838899_14373.JPEG +n02699494_39238.JPEG +n03873416_20934.JPEG +n02092002_15748.JPEG +n03929660_21291.JPEG +n04592741_1679.JPEG +n02823428_10871.JPEG +n10565667_12244.JPEG +n03344393_8204.JPEG +n01443537_951.JPEG +n03814639_3510.JPEG +n01491361_5180.JPEG +n02017213_4087.JPEG +n09835506_1905.JPEG +n02834397_1084.JPEG +n02106550_12151.JPEG +n02398521_24739.JPEG +n07697537_20858.JPEG +n01537544_9198.JPEG +n09399592_17453.JPEG +n02894605_39697.JPEG +n02229544_5284.JPEG +n02808304_3236.JPEG +n02110341_9993.JPEG +n01806567_14815.JPEG +n02102040_855.JPEG +n01667114_14266.JPEG +n03218198_6315.JPEG +n04428191_37483.JPEG +n02206856_6356.JPEG +n02776631_52092.JPEG +n03459775_12286.JPEG +n04560804_10216.JPEG +n04525038_91848.JPEG +n01687978_260.JPEG +n01601694_5024.JPEG +n03903868_89191.JPEG +n04039381_2765.JPEG +n04423845_6142.JPEG +n03372029_16173.JPEG +n07734744_13997.JPEG +n02077923_8806.JPEG +n01484850_28725.JPEG +n01687978_7992.JPEG +n03041632_1201.JPEG +n02174001_12142.JPEG +n02443114_15036.JPEG +n03623198_11372.JPEG +n04270147_6721.JPEG +n04380533_1120.JPEG +n04041544_53381.JPEG +n02963159_6500.JPEG +n01641577_4901.JPEG +n03764736_309.JPEG +n02113712_12434.JPEG +n01694178_5073.JPEG +n02992211_13255.JPEG +n02088094_6114.JPEG +n04552348_21400.JPEG +n03787032_10064.JPEG +n03920288_2353.JPEG +n02115641_51451.JPEG +n02099429_2909.JPEG +n03877845_836.JPEG +n02441942_8467.JPEG +n04336792_8909.JPEG +n03207743_11546.JPEG +n04099969_3237.JPEG +n02319095_1971.JPEG +n02704792_2080.JPEG +n04120489_7114.JPEG +n07873807_10225.JPEG +n03240683_1379.JPEG +n03832673_15706.JPEG +n03733131_7042.JPEG +n03584254_3863.JPEG +n02444819_5700.JPEG +n02877765_1487.JPEG +n02133161_2744.JPEG +n02835271_14097.JPEG +n02088632_603.JPEG +n02097130_952.JPEG +n03032252_20720.JPEG +n02138441_3087.JPEG +n03954731_37390.JPEG +n03355925_2205.JPEG +n09399592_62010.JPEG +n02442845_18351.JPEG +n04370456_1609.JPEG +n01735189_11230.JPEG +n09472597_6334.JPEG +n03000684_14112.JPEG +n01530575_1790.JPEG +n02791270_14990.JPEG +n12768682_2193.JPEG +n13133613_20001.JPEG +n02870880_9348.JPEG +n03950228_2686.JPEG +n02085782_16047.JPEG +n02101006_50.JPEG +n01768244_8143.JPEG +n02415577_7641.JPEG +n09193705_18042.JPEG +n02643566_3523.JPEG +n01855032_8461.JPEG +n02484975_8996.JPEG +n02787622_19095.JPEG +n03992509_10021.JPEG +n02488702_4047.JPEG +n02017213_16841.JPEG +n04462240_9523.JPEG +n03535780_15576.JPEG +n04355933_1720.JPEG +n02504458_9273.JPEG +n03899768_32237.JPEG +n03814639_2160.JPEG +n02321529_16045.JPEG +n13037406_7826.JPEG +n03930630_853.JPEG +n09428293_47753.JPEG +n02233338_15787.JPEG +n03180011_10635.JPEG +n01819313_4814.JPEG +n02963159_10548.JPEG +n04326547_7513.JPEG +n02264363_9076.JPEG +n04371774_12762.JPEG +n03832673_13479.JPEG +n03599486_17128.JPEG +n01755581_12941.JPEG +n02892201_7682.JPEG +n02190166_3202.JPEG +n02066245_4599.JPEG +n01616318_2709.JPEG +n02113023_9621.JPEG +n04127249_9614.JPEG +n03085013_20837.JPEG +n02086646_1971.JPEG +n02422699_800.JPEG +n03026506_480.JPEG +n01641577_11736.JPEG +n04192698_36236.JPEG +n03903868_10280.JPEG +n07734744_1059.JPEG +n02443484_3830.JPEG +n01924916_7368.JPEG +n07684084_526.JPEG +n02013706_7023.JPEG +n04270147_19200.JPEG +n02699494_12915.JPEG +n03188531_1762.JPEG +n02089078_9345.JPEG +n04399382_11680.JPEG +n04584207_6093.JPEG +n03970156_13148.JPEG +n09472597_40589.JPEG +n01630670_6420.JPEG +n03764736_10066.JPEG +n01558993_5675.JPEG +n04229816_4221.JPEG +n03764736_7495.JPEG +n06596364_2269.JPEG +n03594945_12191.JPEG +n04356056_58099.JPEG +n02396427_6013.JPEG +n03271574_5141.JPEG +n04523525_34578.JPEG +n02090379_3994.JPEG +n01580077_2498.JPEG +n01675722_4079.JPEG +n09229709_34076.JPEG +n03961711_3058.JPEG +n03223299_6371.JPEG +n03777754_7185.JPEG +n02999410_53878.JPEG +n01924916_1334.JPEG +n04136333_3146.JPEG +n04597913_6422.JPEG +n02112706_678.JPEG +n01728920_17562.JPEG +n03742115_1227.JPEG +n13044778_10163.JPEG +n04086273_9404.JPEG +n04070727_28652.JPEG +n04591713_4992.JPEG +n02397096_2305.JPEG +n02834397_3200.JPEG +n02268443_49662.JPEG +n03773504_8489.JPEG +n03743016_795.JPEG +n01748264_6927.JPEG +n02422106_2702.JPEG +n04065272_48284.JPEG +n03530642_19509.JPEG +n02981792_16128.JPEG +n03457902_42818.JPEG +n04579432_16440.JPEG +n01798484_18359.JPEG +n01985128_9312.JPEG +n02699494_144.JPEG +n02086079_10996.JPEG +n01917289_3088.JPEG +n09246464_23178.JPEG +n03814639_808.JPEG +n03016953_35561.JPEG +n07753592_8891.JPEG +n04266014_6112.JPEG +n01955084_4313.JPEG +n04258138_7974.JPEG +n01749939_9756.JPEG +n04238763_2341.JPEG +n03788195_22293.JPEG +n02494079_591.JPEG +n02102177_8953.JPEG +n04509417_10220.JPEG +n04522168_1192.JPEG +n04310018_10882.JPEG +n02113624_2915.JPEG +n03134739_4537.JPEG +n02093428_2081.JPEG +n10148035_86.JPEG +n07718472_20795.JPEG +n03393912_12660.JPEG +n04067472_13071.JPEG +n01689811_4114.JPEG +n02025239_10843.JPEG +n09472597_15134.JPEG +n03982430_38902.JPEG +n03792972_6831.JPEG +n01580077_12413.JPEG +n03498962_5844.JPEG +n02167151_11188.JPEG +n03041632_12683.JPEG +n01818515_25282.JPEG +n01601694_532.JPEG +n07760859_6690.JPEG +n02112018_726.JPEG +n03874293_15467.JPEG +n03417042_27966.JPEG +n03100240_10078.JPEG +n04522168_5725.JPEG +n01592084_7219.JPEG +n02795169_13713.JPEG +n03018349_6681.JPEG +n04069434_2797.JPEG +n03891332_6248.JPEG +n03929855_1002.JPEG +n02870880_16481.JPEG +n04192698_69946.JPEG +n02102480_6923.JPEG +n04476259_70156.JPEG +n03141823_1297.JPEG +n03982430_19618.JPEG +n04483307_8789.JPEG +n02483362_3723.JPEG +n02786058_10210.JPEG +n02841315_21073.JPEG +n04485082_34648.JPEG +n03954731_36621.JPEG +n01667114_3605.JPEG +n02641379_9937.JPEG +n02486410_13341.JPEG +n02342885_774.JPEG +n03903868_27034.JPEG +n01843065_5449.JPEG +n07718472_662.JPEG +n03937543_468.JPEG +n03930313_3789.JPEG +n01616318_203.JPEG +n01824575_10967.JPEG +n04153751_5194.JPEG +n03877845_939.JPEG +n02364673_15236.JPEG +n02011460_2382.JPEG +n02113624_4959.JPEG +n01735189_21032.JPEG +n02917067_11092.JPEG +n01847000_12258.JPEG +n01616318_23533.JPEG +n03250847_10419.JPEG +n02236044_13024.JPEG +n01641577_18582.JPEG +n02441942_20895.JPEG +n03452741_8853.JPEG +n01582220_9333.JPEG +n03544143_22855.JPEG +n03445924_7307.JPEG +n02259212_55.JPEG +n07697537_32858.JPEG +n02988304_9345.JPEG +n03706229_5385.JPEG +n02107312_1920.JPEG +n02769748_17548.JPEG +n04366367_5135.JPEG +n03977966_30319.JPEG +n02112706_5512.JPEG +n04476259_4657.JPEG +n03297495_14177.JPEG +n04398044_9409.JPEG +n02105056_6272.JPEG +n04612504_14308.JPEG +n03742115_6200.JPEG +n03733281_25216.JPEG +n07717556_7832.JPEG +n11879895_1897.JPEG +n04208210_355.JPEG +n03538406_3667.JPEG +n02999410_9797.JPEG +n02445715_14478.JPEG +n02092002_5276.JPEG +n02974003_9531.JPEG +n03866082_1887.JPEG +n02441942_9745.JPEG +n04485082_6535.JPEG +n02747177_9141.JPEG +n02486261_11721.JPEG +n04243546_15367.JPEG +n03992509_11561.JPEG +n03085013_22027.JPEG +n03887697_1690.JPEG +n03457902_12304.JPEG +n02966193_17997.JPEG +n04525038_13707.JPEG +n02992211_31434.JPEG +n02361337_2040.JPEG +n03970156_13006.JPEG +n03584254_1935.JPEG +n01824575_2504.JPEG +n02086646_7600.JPEG +n04004767_6447.JPEG +n13133613_31231.JPEG +n04418357_17341.JPEG +n04005630_33271.JPEG +n02236044_5215.JPEG +n03991062_25291.JPEG +n11879895_7633.JPEG +n04429376_1326.JPEG +n02169497_9750.JPEG +n03938244_17401.JPEG +n02130308_21932.JPEG +n03759954_413.JPEG +n02107312_5191.JPEG +n02104029_8059.JPEG +n04591157_5642.JPEG +n02097209_1807.JPEG +n01990800_891.JPEG +n04285008_1785.JPEG +n01990800_12648.JPEG +n04086273_48308.JPEG +n01496331_33223.JPEG +n02264363_8015.JPEG +n04482393_11041.JPEG +n02123394_4630.JPEG +n07875152_5469.JPEG +n04317175_4630.JPEG +n03016953_1742.JPEG +n04328186_8585.JPEG +n03814639_5850.JPEG +n03887697_12300.JPEG +n03662601_35147.JPEG +n02787622_9425.JPEG +n12998815_7236.JPEG +n04592741_15402.JPEG +n03775071_10208.JPEG +n03733805_1633.JPEG +n03447721_7954.JPEG +n02013706_21407.JPEG +n03494278_15869.JPEG +n02536864_5538.JPEG +n04026417_7796.JPEG +n04604644_13123.JPEG +n03496892_37381.JPEG +n06874185_10395.JPEG +n03347037_5882.JPEG +n03794056_19120.JPEG +n01819313_5804.JPEG +n07753592_6756.JPEG +n02979186_606.JPEG +n02058221_22618.JPEG +n07613480_9010.JPEG +n03710637_405.JPEG +n04461696_19359.JPEG +n01514859_5925.JPEG +n02259212_3289.JPEG +n02002724_545.JPEG +n02105412_4921.JPEG +n01685808_5792.JPEG +n03788365_19884.JPEG +n02098286_2833.JPEG +n04335435_14785.JPEG +n02097047_1060.JPEG +n02319095_6597.JPEG +n13044778_633.JPEG +n02097130_11170.JPEG +n09428293_19518.JPEG +n07711569_5947.JPEG +n04041544_17196.JPEG +n03832673_11784.JPEG +n02099849_5219.JPEG +n02190166_5385.JPEG +n01693334_18660.JPEG +n07875152_5228.JPEG +n07718747_12477.JPEG +n02123394_10126.JPEG +n02088094_7956.JPEG +n01632777_13471.JPEG +n03788195_24130.JPEG +n02117135_7925.JPEG +n02526121_3777.JPEG +n01443537_5014.JPEG +n01943899_13796.JPEG +n07716358_4145.JPEG +n02009229_2871.JPEG +n03337140_33438.JPEG +n04487081_8970.JPEG +n02113978_1398.JPEG +n07760859_12954.JPEG +n03710193_8978.JPEG +n02090721_4885.JPEG +n03498962_3240.JPEG +n13044778_12308.JPEG +n02206856_7100.JPEG +n04483307_9337.JPEG +n02825657_10944.JPEG +n02102480_8767.JPEG +n02110958_5910.JPEG +n03595614_14216.JPEG +n09288635_13253.JPEG +n03594734_19952.JPEG +n04099969_7788.JPEG +n02104029_6741.JPEG +n02328150_7026.JPEG +n03841143_8229.JPEG +n01558993_19408.JPEG +n02128925_14257.JPEG +n02794156_9157.JPEG +n04039381_26528.JPEG +n03788365_2532.JPEG +n02930766_26330.JPEG +n03781244_20077.JPEG +n03998194_6129.JPEG +n01688243_2506.JPEG +n02108915_220.JPEG +n09256479_2222.JPEG +n02128385_6256.JPEG +n02514041_5707.JPEG +n02236044_9700.JPEG +n02093428_15390.JPEG +n03788365_1864.JPEG +n04004767_12405.JPEG +n03854065_7606.JPEG +n02704792_13718.JPEG +n07716906_8761.JPEG +n07753275_4791.JPEG +n02489166_7261.JPEG +n07714571_2575.JPEG +n13044778_10175.JPEG +n04389033_3070.JPEG +n02002724_3038.JPEG +n02233338_6513.JPEG +n02093647_330.JPEG +n07614500_60829.JPEG +n02403003_3368.JPEG +n01945685_9879.JPEG +n07697537_4861.JPEG +n01917289_2388.JPEG +n04149813_3557.JPEG +n02483708_4469.JPEG +n04179913_12989.JPEG +n04067472_8418.JPEG +n12057211_4566.JPEG +n02089078_10478.JPEG +n02692877_15767.JPEG +n02834397_9118.JPEG +n02125311_7490.JPEG +n01440764_10040.JPEG +n07892512_12947.JPEG +n02641379_5442.JPEG +n01749939_12349.JPEG +n03947888_25428.JPEG +n04049303_15162.JPEG +n04447861_5329.JPEG +n01829413_5308.JPEG +n04418357_9604.JPEG +n03710193_8542.JPEG +n02113799_3096.JPEG +n09421951_3936.JPEG +n04254680_9018.JPEG +n01534433_75.JPEG +n02112137_6549.JPEG +n04505470_5700.JPEG +n07932039_1791.JPEG +n04131690_797.JPEG +n02165105_2709.JPEG +n02013706_19857.JPEG +n07565083_13653.JPEG +n02085936_4615.JPEG +n02281406_1109.JPEG +n01784675_3926.JPEG +n02326432_15587.JPEG +n03895866_22447.JPEG +n04070727_52070.JPEG +n04612504_4465.JPEG +n01773549_4504.JPEG +n02097474_15146.JPEG +n02342885_824.JPEG +n01855032_7567.JPEG +n01692333_12747.JPEG +n04507155_1083.JPEG +n02769748_87238.JPEG +n02509815_1462.JPEG +n02730930_18859.JPEG +n01630670_5519.JPEG +n03970156_25077.JPEG +n01685808_5388.JPEG +n04037443_17104.JPEG +n02007558_7519.JPEG +n01630670_925.JPEG +n03796401_2861.JPEG +n02692877_1052.JPEG +n02787622_4563.JPEG +n01882714_12015.JPEG +n02099601_3764.JPEG +n02277742_4834.JPEG +n02088466_5211.JPEG +n03000134_3945.JPEG +n07892512_34465.JPEG +n02110958_3848.JPEG +n02977058_24952.JPEG +n01632458_11569.JPEG +n03884397_14776.JPEG +n04479046_9605.JPEG +n03109150_1761.JPEG +n02489166_10804.JPEG +n04591713_11499.JPEG +n03443371_10230.JPEG +n01797886_27005.JPEG +n02128757_11144.JPEG +n01756291_26613.JPEG +n03657121_4026.JPEG +n04357314_3003.JPEG +n02782093_2086.JPEG +n02859443_49406.JPEG +n04367480_38177.JPEG +n02089078_2333.JPEG +n03467068_9167.JPEG +n02840245_11806.JPEG +n04229816_5274.JPEG +n02966193_13691.JPEG +n01667114_9930.JPEG +n03188531_10297.JPEG +n03337140_5258.JPEG +n03125729_8910.JPEG +n02110341_10177.JPEG +n02814533_95653.JPEG +n07697313_13660.JPEG +n02115913_13680.JPEG +n07248320_106367.JPEG +n04049303_1698.JPEG +n02088632_1957.JPEG +n12057211_3821.JPEG +n04465501_4707.JPEG +n01773549_3209.JPEG +n03970156_35197.JPEG +n02167151_4004.JPEG +n03534580_10058.JPEG +n04330267_20458.JPEG +n03376595_8012.JPEG +n02129604_7139.JPEG +n02804414_2705.JPEG +n02814860_12701.JPEG +n01817953_3791.JPEG +n04548280_6437.JPEG +n01981276_7333.JPEG +n02361337_260.JPEG +n03376595_13596.JPEG +n01773797_4556.JPEG +n03630383_3655.JPEG +n04560804_2099.JPEG +n03495258_24377.JPEG +n02088238_274.JPEG +n02093754_6853.JPEG +n02102973_480.JPEG +n02110341_11639.JPEG +n02415577_19471.JPEG +n07583066_766.JPEG +n04141076_43510.JPEG +n04154565_17703.JPEG +n04296562_16350.JPEG +n02787622_5334.JPEG +n01978287_1018.JPEG +n02815834_7510.JPEG +n02795169_22891.JPEG +n02483362_6490.JPEG +n01667114_1089.JPEG +n07697313_4021.JPEG +n04311004_700.JPEG +n02437616_4705.JPEG +n04254120_767.JPEG +n02259212_2894.JPEG +n03063599_1381.JPEG +n04550184_40817.JPEG +n02666196_16608.JPEG +n04371430_7661.JPEG +n04252077_762.JPEG +n03761084_7881.JPEG +n02129165_17316.JPEG +n02268443_37274.JPEG +n03482405_6256.JPEG +n01744401_10298.JPEG +n03995372_19816.JPEG +n13052670_1902.JPEG +n01592084_4216.JPEG +n03424325_24639.JPEG +n04328186_43322.JPEG +n02025239_16246.JPEG +n03877472_14454.JPEG +n02281406_11777.JPEG +n09288635_3469.JPEG +n07802026_1308.JPEG +n04579432_4262.JPEG +n03676483_3659.JPEG +n03803284_2985.JPEG +n03379051_4800.JPEG +n04162706_1641.JPEG +n02342885_96.JPEG +n02115913_10177.JPEG +n01734418_3982.JPEG +n03461385_43447.JPEG +n01698640_4033.JPEG +n03742115_15339.JPEG +n04487394_28422.JPEG +n01829413_7624.JPEG +n03345487_15840.JPEG +n03485794_53531.JPEG +n02488702_6407.JPEG +n03445924_3216.JPEG +n02086240_6690.JPEG +n04429376_39408.JPEG +n04005630_72796.JPEG +n01494475_5981.JPEG +n03954731_24512.JPEG +n02088094_1254.JPEG +n04154565_389.JPEG +n07753113_10851.JPEG +n04141076_34482.JPEG +n02027492_875.JPEG +n03100240_2654.JPEG +n03476991_433.JPEG +n02236044_507.JPEG +n02130308_6674.JPEG +n03792972_5883.JPEG +n02979186_6882.JPEG +n01770081_6510.JPEG +n01675722_3404.JPEG +n03201208_29377.JPEG +n02397096_551.JPEG +n04040759_11159.JPEG +n01580077_5633.JPEG +n01728572_5699.JPEG +n03623198_3016.JPEG +n02167151_3636.JPEG +n12998815_11520.JPEG +n01818515_6302.JPEG +n01807496_5971.JPEG +n03937543_2623.JPEG +n03481172_7203.JPEG +n03180011_7768.JPEG +n02281406_1412.JPEG +n02397096_17931.JPEG +n03476684_30824.JPEG +n15075141_4588.JPEG +n04127249_23815.JPEG +n02132136_9105.JPEG +n02114712_18999.JPEG +n03544143_17145.JPEG +n03085013_23791.JPEG +n01608432_11612.JPEG +n04325704_12087.JPEG +n01955084_7435.JPEG +n02690373_9680.JPEG +n03980874_13166.JPEG +n02127052_6396.JPEG +n04254680_885.JPEG +n03775071_18260.JPEG +n02165456_7293.JPEG +n04597913_3301.JPEG +n01532829_2468.JPEG +n01631663_1530.JPEG +n03637318_1725.JPEG +n02776631_16373.JPEG +n04482393_2088.JPEG +n02009229_1188.JPEG +n07802026_1601.JPEG +n02791270_2423.JPEG +n01984695_63647.JPEG +n03124170_6116.JPEG +n03929855_6493.JPEG +n01740131_2962.JPEG +n02112706_5127.JPEG +n03179701_18122.JPEG +n03967562_16851.JPEG +n02445715_16340.JPEG +n02408429_31.JPEG +n03759954_19811.JPEG +n04540053_9641.JPEG +n04147183_38485.JPEG +n04228054_5303.JPEG +n02097130_11186.JPEG +n07932039_3487.JPEG +n01677366_7185.JPEG +n01682714_8416.JPEG +n03394916_1633.JPEG +n03868242_1504.JPEG +n04133789_3021.JPEG +n01883070_1368.JPEG +n04447861_6317.JPEG +n04039381_4555.JPEG +n02483708_1818.JPEG +n02017213_11566.JPEG +n03404251_4265.JPEG +n04265275_4429.JPEG +n02108089_78.JPEG +n02391049_6208.JPEG +n02098286_3760.JPEG +n07590611_4524.JPEG +n02109961_5601.JPEG +n04579432_16192.JPEG +n02174001_12288.JPEG +n02410509_5697.JPEG +n07753113_522.JPEG +n02172182_1481.JPEG +n03958227_8423.JPEG +n04487081_18116.JPEG +n02012849_6598.JPEG +n02165105_6949.JPEG +n02815834_11952.JPEG +n02113023_186.JPEG +n03595614_32591.JPEG +n02090622_5981.JPEG +n07871810_11595.JPEG +n01484850_22694.JPEG +n02113624_1216.JPEG +n07684084_2956.JPEG +n03089624_13001.JPEG +n03775071_29450.JPEG +n02098286_5241.JPEG +n02093859_299.JPEG +n02090379_2911.JPEG +n04435653_1052.JPEG +n01518878_440.JPEG +n02799071_39753.JPEG +n04456115_11188.JPEG +n04086273_23093.JPEG +n02056570_9720.JPEG +n03372029_41763.JPEG +n04371430_15087.JPEG +n03259280_11608.JPEG +n02096177_12966.JPEG +n02111889_2496.JPEG +n01833805_13578.JPEG +n02134418_1382.JPEG +n09428293_35688.JPEG +n03709823_24105.JPEG +n04040759_5084.JPEG +n03710637_5360.JPEG +n04285008_13958.JPEG +n02233338_4297.JPEG +n01847000_11641.JPEG +n03344393_5163.JPEG +n02666196_47.JPEG +n02268443_7032.JPEG +n02948072_2466.JPEG +n04200800_30350.JPEG +n02870880_9223.JPEG +n07697313_1965.JPEG +n03337140_6306.JPEG +n07614500_11876.JPEG +n02325366_2013.JPEG +n02093859_1487.JPEG +n02277742_17062.JPEG +n03721384_4403.JPEG +n03803284_10528.JPEG +n04286575_1540.JPEG +n04311174_3511.JPEG +n02865351_3577.JPEG +n02120505_1472.JPEG +n03908714_5266.JPEG +n03814906_31254.JPEG +n04371774_38763.JPEG +n02108089_16927.JPEG +n02107312_811.JPEG +n02782093_40.JPEG +n12057211_7442.JPEG +n02488702_6748.JPEG +n04192698_9104.JPEG +n07613480_1352.JPEG +n07718747_7191.JPEG +n04525305_1242.JPEG +n04612504_15647.JPEG +n02091831_9254.JPEG +n03673027_14374.JPEG +n02099849_6211.JPEG +n01873310_27652.JPEG +n02492035_530.JPEG +n04116512_12116.JPEG +n03680355_4832.JPEG +n03026506_6511.JPEG +n01914609_8678.JPEG +n02018795_3113.JPEG +n02123045_11048.JPEG +n02643566_7416.JPEG +n02087046_29.JPEG +n02102318_3374.JPEG +n02841315_5138.JPEG +n04277352_2804.JPEG +n02777292_23919.JPEG +n03775071_1371.JPEG +n02018207_4821.JPEG +n04265275_8307.JPEG +n02412080_17348.JPEG +n02398521_20190.JPEG +n02114548_876.JPEG +n02107142_50585.JPEG +n01829413_4966.JPEG +n02701002_6378.JPEG +n01742172_26839.JPEG +n04435653_2645.JPEG +n03018349_3154.JPEG +n02074367_2632.JPEG +n01774384_7166.JPEG +n04557648_9649.JPEG +n01443537_16377.JPEG +n01883070_438.JPEG +n04152593_535.JPEG +n02106550_7785.JPEG +n02939185_58541.JPEG +n04141975_30255.JPEG +n07613480_4137.JPEG +n03950228_13618.JPEG +n02692877_28135.JPEG +n06359193_27172.JPEG +n03272562_8913.JPEG +n03534580_3268.JPEG +n03450230_6440.JPEG +n03459775_31863.JPEG +n02168699_7844.JPEG +n07565083_9460.JPEG +n02415577_505.JPEG +n02655020_39383.JPEG +n02494079_3615.JPEG +n03110669_147106.JPEG +n04597913_7042.JPEG +n03425413_13069.JPEG +n03584829_26978.JPEG +n03930313_15735.JPEG +n02066245_7736.JPEG +n02823750_2964.JPEG +n03970156_1110.JPEG +n02814860_30502.JPEG +n09256479_485.JPEG +n01440764_13035.JPEG +n02206856_5811.JPEG +n02317335_17021.JPEG +n02097047_1813.JPEG +n12768682_12345.JPEG +n01950731_23500.JPEG +n01537544_8881.JPEG +n02114548_3450.JPEG +n04371774_13893.JPEG +n03394916_15476.JPEG +n01704323_2389.JPEG +n02487347_634.JPEG +n03843555_6050.JPEG +n04005630_128206.JPEG +n04023962_32474.JPEG +n02799071_3536.JPEG +n03884397_4940.JPEG +n04208210_1590.JPEG +n04485082_18123.JPEG +n02906734_26085.JPEG +n02865351_30090.JPEG +n03697007_36646.JPEG +n02109525_2013.JPEG +n02107574_4157.JPEG +n02948072_29649.JPEG +n03877845_8486.JPEG +n02276258_8278.JPEG +n03325584_12039.JPEG +n04536866_18425.JPEG +n02113023_894.JPEG +n04265275_2395.JPEG +n01669191_2337.JPEG +n01742172_19035.JPEG +n02871525_2941.JPEG +n03197337_1257.JPEG +n04286575_33797.JPEG +n03017168_48786.JPEG +n01873310_32640.JPEG +n03314780_7482.JPEG +n03838899_5205.JPEG +n03223299_1168.JPEG +n02804414_4313.JPEG +n01873310_8435.JPEG +n07871810_546.JPEG +n02107683_993.JPEG +n02110185_11445.JPEG +n01608432_7511.JPEG +n04443257_9361.JPEG +n01496331_28214.JPEG +n01632777_7596.JPEG +n02172182_15621.JPEG +n03854065_1277.JPEG +n01667778_673.JPEG +n04317175_8965.JPEG +n03424325_28662.JPEG +n04332243_3201.JPEG +n03498962_18699.JPEG +n03347037_15086.JPEG +n03538406_9886.JPEG +n01774384_2065.JPEG +n02795169_6215.JPEG +n07875152_533.JPEG +n03791053_8669.JPEG +n02106382_15816.JPEG +n02481823_13286.JPEG +n02906734_18608.JPEG +n03814639_340.JPEG +n02105641_13991.JPEG +n04592741_9378.JPEG +n07753592_15747.JPEG +n02834397_130.JPEG +n02708093_2271.JPEG +n02992529_41206.JPEG +n04479046_12820.JPEG +n02091831_9736.JPEG +n03887697_1072.JPEG +n01737021_14871.JPEG +n02097474_17608.JPEG +n03623198_4380.JPEG +n03777754_12612.JPEG +n02823428_3140.JPEG +n04417672_15593.JPEG +n01630670_4486.JPEG +n04476259_54627.JPEG +n02112350_591.JPEG +n01698640_22503.JPEG +n03347037_557.JPEG +n13044778_875.JPEG +n02397096_2375.JPEG +n01629819_5129.JPEG +n09399592_78550.JPEG +n03272010_10867.JPEG +n02909870_11145.JPEG +n02443484_345.JPEG +n01440764_36.JPEG +n03495258_1386.JPEG +n01984695_41760.JPEG +n02804610_13225.JPEG +n03075370_13669.JPEG +n04270147_7630.JPEG +n02112137_11187.JPEG +n02280649_1567.JPEG +n02090622_1845.JPEG +n02108422_6838.JPEG +n03496892_27701.JPEG +n03535780_13847.JPEG +n04562935_2803.JPEG +n04557648_1955.JPEG +n01484850_23890.JPEG +n03290653_4198.JPEG +n02910353_18512.JPEG +n01755581_5970.JPEG +n02276258_1065.JPEG +n02486261_9724.JPEG +n03743016_19214.JPEG +n02089078_1337.JPEG +n02226429_16164.JPEG +n02028035_4320.JPEG +n03529860_4078.JPEG +n04239074_17426.JPEG +n07860988_25360.JPEG +n02089867_7765.JPEG +n01644900_745.JPEG +n01664065_14823.JPEG +n02444819_11713.JPEG +n04204347_17111.JPEG +n04560804_633.JPEG +n03793489_7757.JPEG +n02514041_6362.JPEG +n01910747_17377.JPEG +n02101388_8488.JPEG +n01753488_13594.JPEG +n03841143_15007.JPEG +n04141327_1143.JPEG +n01955084_8082.JPEG +n07720875_9391.JPEG +n01582220_9674.JPEG +n04266014_4150.JPEG +n02091467_2298.JPEG +n02105251_11438.JPEG +n03884397_15504.JPEG +n03272010_6648.JPEG +n02281787_4126.JPEG +n03249569_35885.JPEG +n02389026_4656.JPEG +n04041544_2389.JPEG +n03110669_117144.JPEG +n04335435_10116.JPEG +n04428191_972.JPEG +n04259630_36939.JPEG +n03355925_1590.JPEG +n04376876_12834.JPEG +n02172182_6114.JPEG +n02917067_33366.JPEG +n02111129_446.JPEG +n04090263_2576.JPEG +n12985857_423.JPEG +n04192698_32214.JPEG +n02823750_2653.JPEG +n01818515_4848.JPEG +n02233338_2124.JPEG +n13052670_10458.JPEG +n02977058_23753.JPEG +n02027492_2480.JPEG +n03884397_21567.JPEG +n03976467_7726.JPEG +n03272562_11806.JPEG +n02110063_3023.JPEG +n03584254_5921.JPEG +n02749479_6276.JPEG +n02111277_34038.JPEG +n02111500_7070.JPEG +n02114367_3548.JPEG +n02096294_6380.JPEG +n03447447_7357.JPEG +n02134084_14727.JPEG +n03690938_5273.JPEG +n04239074_12342.JPEG +n02930766_58937.JPEG +n02110806_3638.JPEG +n04239074_27119.JPEG +n02087394_24079.JPEG +n02105855_12412.JPEG +n03843555_11054.JPEG +n02640242_6088.JPEG +n03868242_5167.JPEG +n04366367_2070.JPEG +n07753113_14443.JPEG +n03089624_41143.JPEG +n02101556_9264.JPEG +n04039381_4497.JPEG +n03794056_13477.JPEG +n02105251_4843.JPEG +n01806567_20679.JPEG +n01751748_3658.JPEG +n03188531_13631.JPEG +n02097209_5148.JPEG +n02879718_1240.JPEG +n04116512_8452.JPEG +n02105855_375.JPEG +n02011460_16730.JPEG +n02138441_189.JPEG +n03494278_23847.JPEG +n03590841_779.JPEG +n04366367_6646.JPEG +n04326547_2659.JPEG +n02097658_6943.JPEG +n03710721_15537.JPEG +n07695742_7960.JPEG +n02018207_3530.JPEG +n03876231_13315.JPEG +n02277742_36945.JPEG +n03721384_36272.JPEG +n04486054_16665.JPEG +n02454379_17423.JPEG +n01768244_5939.JPEG +n02107574_3918.JPEG +n03527444_2415.JPEG +n02114548_4466.JPEG +n02092339_6329.JPEG +n02727426_35739.JPEG +n04465501_1489.JPEG +n02102040_7841.JPEG +n02119789_3225.JPEG +n02692877_34067.JPEG +n01601694_11642.JPEG +n04487394_22170.JPEG +n02727426_5187.JPEG +n04344873_3786.JPEG +n03131574_25140.JPEG +n03201208_212.JPEG +n01698640_13137.JPEG +n04044716_1657.JPEG +n02105855_4834.JPEG +n01677366_1285.JPEG +n02091831_2444.JPEG +n04239074_2946.JPEG +n03933933_2690.JPEG +n02443114_1969.JPEG +n03782006_16066.JPEG +n01735189_3767.JPEG +n03095699_18315.JPEG +n04069434_5102.JPEG +n03000684_389.JPEG +n03773504_17608.JPEG +n02033041_880.JPEG +n03895866_89279.JPEG +n02783161_21780.JPEG +n02971356_11028.JPEG +n04033901_934.JPEG +n02797295_3468.JPEG +n02110627_13732.JPEG +n02091032_1005.JPEG +n02699494_844.JPEG +n07730033_10547.JPEG +n02113978_7009.JPEG +n01514668_17238.JPEG +n04562935_10532.JPEG +n04355338_23047.JPEG +n01669191_11621.JPEG +n01737021_20692.JPEG +n04392985_255.JPEG +n02442845_9672.JPEG +n02090622_7732.JPEG +n02910353_6994.JPEG +n02412080_52582.JPEG +n02859443_14540.JPEG +n02808304_19751.JPEG +n02447366_5397.JPEG +n02410509_1697.JPEG +n04505470_5006.JPEG +n02111129_8089.JPEG +n03598930_29979.JPEG +n04548280_4592.JPEG +n07768694_1062.JPEG +n04456115_46773.JPEG +n02410509_1752.JPEG +n02113186_7308.JPEG +n03775546_15783.JPEG +n02804414_7904.JPEG +n04493381_42490.JPEG +n03259280_6081.JPEG +n03924679_12942.JPEG +n02095314_662.JPEG +n04589890_1644.JPEG +n02927161_13392.JPEG +n02457408_539.JPEG +n02123045_12844.JPEG +n02727426_12819.JPEG +n01981276_14662.JPEG +n01734418_8729.JPEG +n07695742_2512.JPEG +n02113799_8022.JPEG +n03208938_15925.JPEG +n04118776_1803.JPEG +n02514041_12400.JPEG +n07753275_3590.JPEG +n02129165_710.JPEG +n02423022_272.JPEG +n01688243_4919.JPEG +n01980166_4164.JPEG +n02097658_3725.JPEG +n03794056_17533.JPEG +n04275548_102.JPEG +n04589890_3905.JPEG +n03599486_15837.JPEG +n04356056_9898.JPEG +n02415577_3745.JPEG +n02108089_5430.JPEG +n01930112_18066.JPEG +n04228054_2547.JPEG +n02105641_14112.JPEG +n03394916_54247.JPEG +n02097047_5637.JPEG +n03325584_12973.JPEG +n03028079_18085.JPEG +n01677366_10579.JPEG +n02672831_41214.JPEG +n02109961_10547.JPEG +n03781244_6994.JPEG +n02231487_1.JPEG +n02326432_29031.JPEG +n02939185_28974.JPEG +n04487394_20830.JPEG +n03384352_1137.JPEG +n03958227_5929.JPEG +n03764736_9374.JPEG +n02504458_3920.JPEG +n03075370_13202.JPEG +n04612504_6289.JPEG +n03791053_7619.JPEG +n02119022_31800.JPEG +n01514668_6298.JPEG +n02391049_7561.JPEG +n03179701_5182.JPEG +n03259280_6350.JPEG +n02361337_2738.JPEG +n04243546_17816.JPEG +n01833805_13294.JPEG +n02268853_2284.JPEG +n02102318_12942.JPEG +n02493793_1724.JPEG +n04355933_2422.JPEG +n03877845_7601.JPEG +n03791053_14880.JPEG +n07583066_5575.JPEG +n02115913_1237.JPEG +n03873416_21952.JPEG +n02115641_27578.JPEG +n02110958_403.JPEG +n02127052_2225.JPEG +n02489166_3338.JPEG +n02480855_17992.JPEG +n02124075_8093.JPEG +n03983396_11719.JPEG +n02797295_11037.JPEG +n03196217_5636.JPEG +n04613696_6136.JPEG +n04204238_9215.JPEG +n02494079_4453.JPEG +n02783161_15872.JPEG +n02108551_5257.JPEG +n02115913_7692.JPEG +n03388183_710.JPEG +n03207743_6297.JPEG +n04428191_10174.JPEG +n01774750_3479.JPEG +n07873807_3978.JPEG +n02687172_22716.JPEG +n01698640_4013.JPEG +n01629819_10172.JPEG +n03938244_5827.JPEG +n04522168_39415.JPEG +n02100735_3257.JPEG +n02091467_4543.JPEG +n01518878_5499.JPEG +n09288635_29577.JPEG +n03874599_3010.JPEG +n02091032_5739.JPEG +n01729322_1535.JPEG +n02086079_1445.JPEG +n02018795_4598.JPEG +n03933933_28025.JPEG +n02256656_11444.JPEG +n02098413_4413.JPEG +n02279972_5307.JPEG +n02219486_27007.JPEG +n02113712_6527.JPEG +n04192698_15191.JPEG +n02129604_4334.JPEG +n03483316_11109.JPEG +n03958227_9154.JPEG +n03530642_5249.JPEG +n03126707_24704.JPEG +n01824575_450.JPEG +n04239074_22120.JPEG +n02113799_1314.JPEG +n01592084_5552.JPEG +n03062245_5163.JPEG +n04004767_11763.JPEG +n03062245_4275.JPEG +n07590611_8937.JPEG +n03662601_33353.JPEG +n07590611_22556.JPEG +n02096177_11065.JPEG +n03271574_12669.JPEG +n04317175_10067.JPEG +n02988304_16001.JPEG +n02951358_8665.JPEG +n03481172_8507.JPEG +n03857828_16971.JPEG +n02423022_497.JPEG +n01843383_31488.JPEG +n03032252_98613.JPEG +n02110958_8578.JPEG +n01629819_20978.JPEG +n03467068_18072.JPEG +n03929660_4099.JPEG +n03902125_26943.JPEG +n04229816_4898.JPEG +n02672831_18515.JPEG +n02396427_22756.JPEG +n03595614_23405.JPEG +n02817516_1342.JPEG +n09229709_16138.JPEG +n03529860_6156.JPEG +n01704323_9112.JPEG +n04152593_12665.JPEG +n03770439_30612.JPEG +n01855672_5144.JPEG +n03871628_25691.JPEG +n04542943_3890.JPEG +n09468604_49437.JPEG +n04008634_31094.JPEG +n03127925_25324.JPEG +n02981792_11921.JPEG +n04517823_40379.JPEG +n02037110_2541.JPEG +n04485082_8795.JPEG +n04355338_8520.JPEG +n03895866_124514.JPEG +n03146219_16091.JPEG +n03916031_17737.JPEG +n04044716_15664.JPEG +n02097047_5546.JPEG +n03218198_912.JPEG +n02483362_4971.JPEG +n02009912_16533.JPEG +n02099429_4931.JPEG +n02113978_3743.JPEG +n02606052_21141.JPEG +n02113186_1428.JPEG +n01943899_22273.JPEG +n01796340_2903.JPEG +n02321529_4575.JPEG +n02120079_15458.JPEG +n04443257_20845.JPEG +n02437616_1004.JPEG +n02113624_2224.JPEG +n04296562_22309.JPEG +n04550184_37144.JPEG +n04476259_584.JPEG +n04344873_15579.JPEG +n04263257_16565.JPEG +n03532672_18226.JPEG +n04131690_5861.JPEG +n03627232_28074.JPEG +n03201208_29849.JPEG +n02093754_13.JPEG +n02892767_13269.JPEG +n03538406_5770.JPEG +n04458633_8035.JPEG +n07760859_160.JPEG +n02168699_6501.JPEG +n13040303_4449.JPEG +n02104365_4305.JPEG +n04008634_55.JPEG +n01990800_6283.JPEG +n03063599_4447.JPEG +n07718472_6821.JPEG +n03063689_235.JPEG +n04584207_16553.JPEG +n01630670_8760.JPEG +n09428293_7764.JPEG +n04286575_17843.JPEG +n03950228_3621.JPEG +n01773549_2946.JPEG +n07831146_2876.JPEG +n02018207_7195.JPEG +n03788365_2313.JPEG +n07614500_57694.JPEG +n09399592_61323.JPEG +n03733281_10383.JPEG +n04597913_5381.JPEG +n02795169_13812.JPEG +n02489166_13057.JPEG +n04485082_23425.JPEG +n03642806_20689.JPEG +n02877765_4991.JPEG +n01751748_109.JPEG +n12985857_7133.JPEG +n04483307_9386.JPEG +n02086910_15733.JPEG +n03271574_3136.JPEG +n04049303_8799.JPEG +n01687978_12313.JPEG +n03777754_2323.JPEG +n04429376_45613.JPEG +n01978455_6679.JPEG +n02113023_10317.JPEG +n02101556_7626.JPEG +n02883205_6646.JPEG +n04204238_2219.JPEG +n03207743_19269.JPEG +n01753488_17340.JPEG +n07684084_2435.JPEG +n03995372_1536.JPEG +n02442845_16463.JPEG +n01807496_7196.JPEG +n03796401_23667.JPEG +n02788148_37194.JPEG +n03495258_6791.JPEG +n02085782_191.JPEG +n02033041_2240.JPEG +n02109525_14896.JPEG +n03443371_13091.JPEG +n02051845_14471.JPEG +n02098286_960.JPEG +n03697007_14982.JPEG +n04367480_37727.JPEG +n02799071_5324.JPEG +n01882714_9335.JPEG +n02109961_34708.JPEG +n03902125_8215.JPEG +n03776460_39405.JPEG +n01968897_8583.JPEG +n07831146_5636.JPEG +n04366367_8587.JPEG +n04493381_14548.JPEG +n13037406_4029.JPEG +n02025239_11698.JPEG +n04254120_2963.JPEG +n03944341_6349.JPEG +n02087394_2426.JPEG +n02536864_43146.JPEG +n03223299_4481.JPEG +n03344393_3874.JPEG +n03124043_27007.JPEG +n04479046_18122.JPEG +n03045698_1018.JPEG +n03764736_3847.JPEG +n02168699_8881.JPEG +n02676566_3767.JPEG +n03220513_4454.JPEG +n01797886_10871.JPEG +n01440764_8688.JPEG +n04589890_10327.JPEG +n07714990_6731.JPEG +n07734744_3132.JPEG +n04008634_7845.JPEG +n03388183_4582.JPEG +n03016953_31432.JPEG +n02165105_1280.JPEG +n02108089_1806.JPEG +n02817516_35787.JPEG +n02676566_1973.JPEG +n02488702_4057.JPEG +n01729977_16782.JPEG +n03530642_15609.JPEG +n03895866_33472.JPEG +n07716358_9550.JPEG +n04462240_10352.JPEG +n03891251_604.JPEG +n03642806_12864.JPEG +n03843555_5554.JPEG +n02526121_8061.JPEG +n03347037_12874.JPEG +n02012849_27149.JPEG +n04081281_14784.JPEG +n03065424_19773.JPEG +n03998194_7441.JPEG +n03761084_43802.JPEG +n04005630_54514.JPEG +n02119789_3913.JPEG +n13054560_3051.JPEG +n02999410_6554.JPEG +n03721384_16227.JPEG +n04285008_11203.JPEG +n02808304_17051.JPEG +n03873416_12813.JPEG +n07565083_3009.JPEG +n01968897_23138.JPEG +n04465501_223.JPEG +n01632458_232.JPEG +n01930112_9457.JPEG +n02105162_748.JPEG +n03623198_3552.JPEG +n03773504_2743.JPEG +n04493381_4877.JPEG +n03160309_29546.JPEG +n02114367_15215.JPEG +n04522168_34907.JPEG +n02113186_10506.JPEG +n02894605_76444.JPEG +n03131574_12769.JPEG +n04254777_7236.JPEG +n02099849_5169.JPEG +n02971356_1778.JPEG +n03770679_22524.JPEG +n07248320_14338.JPEG +n03710637_11071.JPEG +n01739381_7104.JPEG +n02106550_4337.JPEG +n03032252_8872.JPEG +n04347754_77380.JPEG +n02895154_23650.JPEG +n02493509_22618.JPEG +n02486410_4267.JPEG +n03977966_31636.JPEG +n02111129_5796.JPEG +n02092339_1951.JPEG +n02699494_1614.JPEG +n02692877_22694.JPEG +n04209239_11964.JPEG +n01955084_16201.JPEG +n02089078_2813.JPEG +n02788148_21120.JPEG +n02109047_8083.JPEG +n01943899_16143.JPEG +n04335435_15785.JPEG +n02939185_2969.JPEG +n04192698_8577.JPEG +n02492035_5977.JPEG +n04275548_16197.JPEG +n02325366_9271.JPEG +n03782006_10420.JPEG +n03599486_28666.JPEG +n03032252_55950.JPEG +n03630383_337.JPEG +n04335435_48643.JPEG +n03857828_49117.JPEG +n04613696_975.JPEG +n01751748_2264.JPEG +n03249569_42913.JPEG +n03891251_189.JPEG +n03016953_6584.JPEG +n02190166_9237.JPEG +n02051845_7853.JPEG +n03146219_17012.JPEG +n03692522_3468.JPEG +n02093991_7818.JPEG +n02356798_5320.JPEG +n02128757_12043.JPEG +n02095570_7227.JPEG +n03866082_623.JPEG +n02018207_15290.JPEG +n09256479_5399.JPEG +n02437312_8757.JPEG +n13133613_32991.JPEG +n07717556_8039.JPEG +n02113624_7595.JPEG +n03384352_5953.JPEG +n01776313_463.JPEG +n01622779_10391.JPEG +n01817953_3846.JPEG +n02321529_6682.JPEG +n02109525_11914.JPEG +n01688243_1444.JPEG +n02643566_9982.JPEG +n02917067_22699.JPEG +n02108915_8769.JPEG +n03832673_4130.JPEG +n03721384_725.JPEG +n07684084_645.JPEG +n01770081_20503.JPEG +n02093754_4127.JPEG +n02486410_1799.JPEG +n04350905_4075.JPEG +n01695060_23962.JPEG +n07716358_10825.JPEG +n03100240_17139.JPEG +n02096177_1842.JPEG +n04376876_33065.JPEG +n03942813_10019.JPEG +n01910747_7434.JPEG +n04417672_25281.JPEG +n02127052_5377.JPEG +n07753592_14574.JPEG +n01981276_5327.JPEG +n04118776_64710.JPEG +n02917067_16274.JPEG +n03124170_11278.JPEG +n01622779_4490.JPEG +n12985857_3578.JPEG +n02112706_5231.JPEG +n02804414_344.JPEG +n04467665_34030.JPEG +n03891251_5396.JPEG +n02403003_11459.JPEG +n03770679_16546.JPEG +n02111889_5883.JPEG +n04418357_3224.JPEG +n02417914_41637.JPEG +n04310018_11255.JPEG +n02007558_11326.JPEG +n02443484_3246.JPEG +n02091831_5712.JPEG +n03977966_42965.JPEG +n03666591_17972.JPEG +n01729977_5396.JPEG +n03160309_76922.JPEG +n03676483_437.JPEG +n03796401_28590.JPEG +n04065272_3677.JPEG +n02206856_1367.JPEG +n04326547_10050.JPEG +n03496892_21348.JPEG +n01871265_3744.JPEG +n01685808_5737.JPEG +n03594734_32768.JPEG +n02441942_24322.JPEG +n01773549_15.JPEG +n02110063_17656.JPEG +n03424325_19745.JPEG +n03201208_4352.JPEG +n02493509_6186.JPEG +n01644373_2299.JPEG +n04599235_16228.JPEG +n01914609_10276.JPEG +n01693334_3393.JPEG +n03627232_28524.JPEG +n02172182_1249.JPEG +n07590611_20784.JPEG +n02101556_6635.JPEG +n03658185_5403.JPEG +n01622779_2022.JPEG +n02793495_6514.JPEG +n07714990_892.JPEG +n02346627_11145.JPEG +n01484850_18753.JPEG +n02106030_7491.JPEG +n03482405_27434.JPEG +n04357314_7642.JPEG +n01981276_8193.JPEG +n02006656_7828.JPEG +n04344873_3948.JPEG +n01796340_6191.JPEG +n04371430_14653.JPEG +n02480495_505.JPEG +n03837869_2996.JPEG +n04346328_8029.JPEG +n03733281_40938.JPEG +n02105056_8299.JPEG +n02892201_17277.JPEG +n04111531_6489.JPEG +n02091134_3583.JPEG +n02105855_12333.JPEG +n03970156_1296.JPEG +n07718747_18603.JPEG +n03773504_3662.JPEG +n02120505_14292.JPEG +n04008634_18703.JPEG +n01828970_11414.JPEG +n04380533_5657.JPEG +n03942813_4394.JPEG +n02096294_8595.JPEG +n03877472_7971.JPEG +n02111277_7044.JPEG +n03179701_8441.JPEG +n06794110_2166.JPEG +n02927161_32061.JPEG +n02090622_571.JPEG +n04192698_26592.JPEG +n02704792_11588.JPEG +n07749582_11948.JPEG +n02281406_4545.JPEG +n01682714_362.JPEG +n03947888_12676.JPEG +n03196217_2771.JPEG +n03187595_14767.JPEG +n01632458_2413.JPEG +n04162706_21429.JPEG +n02422699_722.JPEG +n04204238_11081.JPEG +n02088632_1402.JPEG +n07802026_17628.JPEG +n07920052_19002.JPEG +n02108551_23558.JPEG +n03000134_1746.JPEG +n04346328_21255.JPEG +n03775071_3112.JPEG +n02056570_790.JPEG +n01980166_3161.JPEG +n02088238_3562.JPEG +n04485082_8902.JPEG +n02509815_13423.JPEG +n02101006_17088.JPEG +n02111500_5285.JPEG +n01518878_12001.JPEG +n03124043_21903.JPEG +n02790996_11519.JPEG +n04019541_9494.JPEG +n01498041_9474.JPEG +n01484850_2270.JPEG +n03876231_9479.JPEG +n02790996_8268.JPEG +n01537544_9538.JPEG +n09229709_31994.JPEG +n02268443_18816.JPEG +n04243546_6665.JPEG +n04554684_34648.JPEG +n04026417_45590.JPEG +n02268853_3015.JPEG +n09246464_25289.JPEG +n02690373_5797.JPEG +n12768682_4681.JPEG +n04258138_19451.JPEG +n03201208_45285.JPEG +n03967562_16794.JPEG +n02086910_3765.JPEG +n03197337_9608.JPEG +n02091244_916.JPEG +n02096294_2139.JPEG +n02095889_5656.JPEG +n01695060_5251.JPEG +n02841315_5696.JPEG +n04252225_13284.JPEG +n04266014_7241.JPEG +n04560804_32398.JPEG +n02095314_5989.JPEG +n03814639_6533.JPEG +n02108000_3941.JPEG +n04442312_18275.JPEG +n01685808_8747.JPEG +n02437616_1278.JPEG +n03141823_6326.JPEG +n02486261_2440.JPEG +n03661043_15900.JPEG +n02110341_6629.JPEG +n02815834_1786.JPEG +n02730930_9187.JPEG +n04579145_2313.JPEG +n03041632_29680.JPEG +n02966687_6894.JPEG +n02096051_8023.JPEG +n02096294_7519.JPEG +n02089867_6677.JPEG +n04265275_2156.JPEG +n02892201_19609.JPEG +n03290653_5362.JPEG +n03000684_1305.JPEG +n03347037_30824.JPEG +n02095889_6549.JPEG +n01697457_9503.JPEG +n02268853_1131.JPEG +n03109150_3970.JPEG +n04350905_99971.JPEG +n04380533_331.JPEG +n02871525_58104.JPEG +n02279972_2827.JPEG +n01729322_18225.JPEG +n04127249_3432.JPEG +n02058221_12509.JPEG +n07711569_1876.JPEG +n02493793_18183.JPEG +n04252225_9093.JPEG +n04591713_3736.JPEG +n03218198_1083.JPEG +n02909870_4271.JPEG +n02086240_9130.JPEG +n01632458_2635.JPEG +n01784675_9876.JPEG +n02966687_5163.JPEG +n03532672_536.JPEG +n07836838_103.JPEG +n03594945_22594.JPEG +n03447447_14741.JPEG +n02113023_9109.JPEG +n04366367_1117.JPEG +n02727426_13764.JPEG +n02966687_3674.JPEG +n02398521_23763.JPEG +n02123045_11244.JPEG +n01685808_174.JPEG +n02089078_1982.JPEG +n03447721_2245.JPEG +n07248320_7116.JPEG +n03888257_32520.JPEG +n01768244_3993.JPEG +n02690373_3728.JPEG +n04286575_73031.JPEG +n04200800_774.JPEG +n03954731_40257.JPEG +n03476991_26976.JPEG +n02119789_2199.JPEG +n04317175_5403.JPEG +n02009912_12899.JPEG +n02794156_4293.JPEG +n02105412_6770.JPEG +n02037110_7518.JPEG +n03218198_10995.JPEG +n04560804_9405.JPEG +n02974003_6964.JPEG +n03527444_4448.JPEG +n03804744_30314.JPEG +n04487394_4459.JPEG +n02086910_14747.JPEG +n04562935_6426.JPEG +n13040303_4563.JPEG +n09229709_23603.JPEG +n03791053_6522.JPEG +n03662601_28846.JPEG +n04398044_18056.JPEG +n04037443_23754.JPEG +n01728920_5324.JPEG +n01930112_11166.JPEG +n12985857_4567.JPEG +n02101556_5838.JPEG +n02096585_6495.JPEG +n01491361_10041.JPEG +n07831146_1477.JPEG +n02074367_7060.JPEG +n03424325_3010.JPEG +n03255030_28364.JPEG +n03649909_16261.JPEG +n02794156_10430.JPEG +n03729826_28379.JPEG +n09468604_71695.JPEG +n02111277_28036.JPEG +n02917067_13299.JPEG +n04367480_5553.JPEG +n02395406_9081.JPEG +n02106662_11346.JPEG +n03447447_4900.JPEG +n04235860_5667.JPEG +n07590611_18177.JPEG +n02500267_6647.JPEG +n03920288_2910.JPEG +n01978455_3964.JPEG +n03888605_17661.JPEG +n02105412_3867.JPEG +n02480855_313.JPEG +n03980874_6630.JPEG +n02100583_3877.JPEG +n13133613_74174.JPEG +n03187595_13832.JPEG +n04357314_12569.JPEG +n02526121_11495.JPEG +n07684084_1880.JPEG +n02090721_1619.JPEG +n04501370_1427.JPEG +n04153751_6130.JPEG +n13044778_7777.JPEG +n04204238_2293.JPEG +n02109525_74616.JPEG +n03773504_7838.JPEG +n03584254_2659.JPEG +n02130308_21679.JPEG +n07711569_4364.JPEG +n04326547_12569.JPEG +n04162706_2834.JPEG +n04152593_77013.JPEG +n07871810_21575.JPEG +n02454379_16045.JPEG +n02950826_19446.JPEG +n02966193_20383.JPEG +n02363005_17056.JPEG +n02747177_30683.JPEG +n02788148_28348.JPEG +n02028035_9472.JPEG +n03777568_12384.JPEG +n03874599_3434.JPEG +n04229816_1082.JPEG +n04485082_4773.JPEG +n02666196_3345.JPEG +n03843555_6086.JPEG +n03394916_32522.JPEG +n02097658_6529.JPEG +n03126707_9027.JPEG +n01698640_3928.JPEG +n02007558_11696.JPEG +n02114712_17329.JPEG +n02108000_5023.JPEG +n04208210_7846.JPEG +n02276258_1647.JPEG +n04548280_6381.JPEG +n01688243_2735.JPEG +n07745940_5047.JPEG +n03935335_12095.JPEG +n03196217_9615.JPEG +n07734744_5996.JPEG +n04136333_11886.JPEG +n02074367_205.JPEG +n04517823_19231.JPEG +n04515003_20703.JPEG +n04525038_5195.JPEG +n03127925_1772.JPEG +n02963159_19364.JPEG +n02950826_15447.JPEG +n03492542_16229.JPEG +n02727426_19556.JPEG +n02788148_6809.JPEG +n04458633_6556.JPEG +n02097298_12480.JPEG +n04325704_77.JPEG +n04599235_22676.JPEG +n02120079_12297.JPEG +n01693334_2944.JPEG +n03781244_6733.JPEG +n04118776_59307.JPEG +n03485407_17755.JPEG +n07920052_2488.JPEG +n04254120_3348.JPEG +n02097047_4444.JPEG +n12057211_9753.JPEG +n02483708_922.JPEG +n02268853_1650.JPEG +n02009912_3642.JPEG +n03657121_20890.JPEG +n03134739_1516.JPEG +n06596364_8107.JPEG +n02643566_3261.JPEG +n02090721_1717.JPEG +n03673027_13622.JPEG +n04380533_5770.JPEG +n02094114_5290.JPEG +n03452741_14509.JPEG +n02090622_7914.JPEG +n01695060_14372.JPEG +n01984695_56928.JPEG +n01917289_353.JPEG +n04591713_10704.JPEG +n02422106_9438.JPEG +n02457408_25712.JPEG +n01943899_9347.JPEG +n04179913_11712.JPEG +n03770439_11416.JPEG +n03085013_7322.JPEG +n03602883_10008.JPEG +n03676483_12458.JPEG +n04141076_36479.JPEG +n07831146_3285.JPEG +n02510455_1274.JPEG +n04398044_14022.JPEG +n01697457_20722.JPEG +n02326432_506.JPEG +n02445715_354.JPEG +n02116738_19750.JPEG +n02927161_1353.JPEG +n03868863_371.JPEG +n02093754_921.JPEG +n04462240_11067.JPEG +n03920288_8872.JPEG +n04380533_312.JPEG +n01697457_7450.JPEG +n03733805_778.JPEG +n02109047_60295.JPEG +n04239074_3567.JPEG +n03041632_11109.JPEG +n03444034_4067.JPEG +n04532670_8192.JPEG +n07615774_19503.JPEG +n04548280_6888.JPEG +n03584829_24008.JPEG +n03032252_4351.JPEG +n02980441_18289.JPEG +n02825657_17022.JPEG +n03637318_32149.JPEG +n04613696_10081.JPEG +n02097474_6054.JPEG +n02804414_5052.JPEG +n02167151_7924.JPEG +n02655020_5902.JPEG +n02093256_1213.JPEG +n01631663_2414.JPEG +n01843383_11362.JPEG +n04099969_14819.JPEG +n02837789_12362.JPEG +n01917289_789.JPEG +n01819313_2989.JPEG +n04254777_23157.JPEG +n02747177_2169.JPEG +n07714990_6967.JPEG +n04591157_1472.JPEG +n02490219_6361.JPEG +n01950731_24105.JPEG +n02950826_2788.JPEG +n02500267_331.JPEG +n03633091_2332.JPEG +n03832673_11524.JPEG +n02096437_5012.JPEG +n02233338_5798.JPEG +n02071294_15460.JPEG +n02395406_7452.JPEG +n01601694_18600.JPEG +n03717622_12675.JPEG +n02442845_6907.JPEG +n04265275_12527.JPEG +n02089078_10512.JPEG +n03063689_3627.JPEG +n03929660_13195.JPEG +n02123159_4073.JPEG +n02787622_3985.JPEG +n03775546_16690.JPEG +n03916031_27546.JPEG +n03763968_2058.JPEG +n04009552_14145.JPEG +n02790996_4854.JPEG +n02808440_33372.JPEG +n09256479_10518.JPEG +n03532672_66479.JPEG +n01601694_9113.JPEG +n03017168_938.JPEG +n03868242_14691.JPEG +n04554684_22591.JPEG +n04462240_11113.JPEG +n03791053_4664.JPEG +n02107142_61719.JPEG +n01749939_5557.JPEG +n02317335_31830.JPEG +n03930313_1208.JPEG +n02094258_173.JPEG +n07720875_6632.JPEG +n02793495_10523.JPEG +n01688243_650.JPEG +n09256479_9980.JPEG +n03662601_12778.JPEG +n03710637_13112.JPEG +n02437312_9968.JPEG +n04485082_11288.JPEG +n03482405_19324.JPEG +n02280649_3830.JPEG +n04065272_8720.JPEG +n03841143_18754.JPEG +n03788365_11171.JPEG +n02102040_4980.JPEG +n02094433_13559.JPEG +n02346627_4944.JPEG +n02006656_4966.JPEG +n02120505_4033.JPEG +n02487347_10705.JPEG +n03197337_1436.JPEG +n02108089_42766.JPEG +n04074963_4954.JPEG +n02437312_651.JPEG +n12267677_11993.JPEG +n02749479_8619.JPEG +n03891251_177.JPEG +n03065424_17380.JPEG +n01558993_38999.JPEG +n02058221_7890.JPEG +n04606251_249.JPEG +n09428293_34948.JPEG +n01773797_3922.JPEG +n04525038_11243.JPEG +n03127747_9259.JPEG +n01697457_6362.JPEG +n04209133_7482.JPEG +n03100240_13359.JPEG +n04467665_76122.JPEG +n03661043_23784.JPEG +n03376595_1542.JPEG +n02978881_11862.JPEG +n02077923_569.JPEG +n02510455_12369.JPEG +n03803284_6132.JPEG +n02509815_9815.JPEG +n02229544_5.JPEG +n02281406_2872.JPEG +n01950731_6070.JPEG +n02051845_2092.JPEG +n01632458_1784.JPEG +n04548362_8728.JPEG +n07802026_17704.JPEG +n02113624_305.JPEG +n02066245_6198.JPEG +n03792972_5869.JPEG +n03950228_20906.JPEG +n02939185_9905.JPEG +n02823428_334.JPEG +n03899768_89606.JPEG +n03710721_3275.JPEG +n04557648_189.JPEG +n01776313_29328.JPEG +n03676483_31769.JPEG +n02012849_7597.JPEG +n04592741_980.JPEG +n02120505_2156.JPEG +n02492660_1269.JPEG +n02002556_2917.JPEG +n03444034_7115.JPEG +n01664065_15488.JPEG +n04152593_35306.JPEG +n01667778_4721.JPEG +n09399592_39366.JPEG +n01806567_3822.JPEG +n04149813_19601.JPEG +n02095889_8554.JPEG +n01498041_22711.JPEG +n03781244_74861.JPEG +n03028079_7537.JPEG +n02101006_3146.JPEG +n01737021_18.JPEG +n02113186_5660.JPEG +n02422106_1426.JPEG +n02017213_3354.JPEG +n01514859_8585.JPEG +n03594945_16847.JPEG +n02841315_13200.JPEG +n04597913_5925.JPEG +n02106550_8575.JPEG +n02124075_5343.JPEG +n03207941_3680.JPEG +n01688243_2159.JPEG +n07717410_9930.JPEG +n04596742_5981.JPEG +n02110063_16135.JPEG +n02950826_17960.JPEG +n04525038_3002.JPEG +n01669191_8464.JPEG +n02124075_6464.JPEG +n04152593_15522.JPEG +n02071294_15500.JPEG +n02177972_5956.JPEG +n01944390_30404.JPEG +n01755581_5019.JPEG +n02641379_17633.JPEG +n02281406_8343.JPEG +n03125729_26911.JPEG +n03045698_3202.JPEG +n01873310_2116.JPEG +n04532106_14368.JPEG +n01847000_15145.JPEG +n01697457_12281.JPEG +n02113978_1868.JPEG +n04136333_2256.JPEG +n04456115_3596.JPEG +n03291819_99978.JPEG +n02177972_2155.JPEG +n03476684_24535.JPEG +n02226429_17181.JPEG +n02165456_15972.JPEG +n02951585_26775.JPEG +n11939491_44559.JPEG +n04540053_9788.JPEG +n01807496_21.JPEG +n04019541_1548.JPEG +n04099969_34580.JPEG +n02167151_2573.JPEG +n02268443_8980.JPEG +n01514859_11494.JPEG +n03240683_14239.JPEG +n03095699_23741.JPEG +n01644373_426.JPEG +n02138441_705.JPEG +n07583066_9648.JPEG +n03325584_2857.JPEG +n02108422_11510.JPEG +n03825788_45284.JPEG +n03804744_4884.JPEG +n01667114_17564.JPEG +n03345487_2751.JPEG +n01664065_2920.JPEG +n02086646_5643.JPEG +n02747177_4689.JPEG +n02504013_8492.JPEG +n02892767_5330.JPEG +n07768694_37701.JPEG +n02091831_5444.JPEG +n04200800_23452.JPEG +n02106662_17182.JPEG +n07892512_25940.JPEG +n03792972_6223.JPEG +n02099712_6719.JPEG +n03255030_10654.JPEG +n07880968_2157.JPEG +n02808440_25763.JPEG +n04515003_15092.JPEG +n13054560_11254.JPEG +n04604644_13054.JPEG +n03623198_15730.JPEG +n02509815_2552.JPEG +n03485794_7190.JPEG +n02708093_3090.JPEG +n03160309_39299.JPEG +n01775062_4010.JPEG +n07717556_1331.JPEG +n03982430_30432.JPEG +n04482393_2816.JPEG +n02268443_54664.JPEG +n02483708_3387.JPEG +n01872401_14385.JPEG +n02095314_632.JPEG +n02980441_8198.JPEG +n03724870_2958.JPEG +n01531178_1390.JPEG +n03187595_17670.JPEG +n04044716_10462.JPEG +n02091134_5654.JPEG +n04461696_7226.JPEG +n02102480_6994.JPEG +n04553703_5626.JPEG +n02667093_1443.JPEG +n03272562_9791.JPEG +n03937543_1013.JPEG +n01560419_5552.JPEG +n02417914_3798.JPEG +n04350905_33708.JPEG +n02346627_17300.JPEG +n02777292_15211.JPEG +n02088466_6953.JPEG +n04044716_5374.JPEG +n01687978_6896.JPEG +n01755581_10567.JPEG +n01592084_4983.JPEG +n02441942_7017.JPEG +n03384352_6249.JPEG +n02978881_4653.JPEG +n02268443_36343.JPEG +n04310018_20900.JPEG +n02128385_2401.JPEG +n06596364_1334.JPEG +n04579432_27931.JPEG +n02423022_27242.JPEG +n03825788_16833.JPEG +n03908714_6060.JPEG +n01531178_476.JPEG +n02094258_2228.JPEG +n07579787_19868.JPEG +n07583066_4227.JPEG +n02091831_1099.JPEG +n03871628_8487.JPEG +n02892767_8928.JPEG +n02115641_40866.JPEG +n03769881_11337.JPEG +n02797295_5909.JPEG +n04346328_18658.JPEG +n04252077_4237.JPEG +n02797295_13179.JPEG +n01632777_19052.JPEG +n02226429_12392.JPEG +n01592084_3555.JPEG +n07565083_13258.JPEG +n02397096_5328.JPEG +n01955084_3186.JPEG +n02113186_7949.JPEG +n02165105_8357.JPEG +n02097658_8515.JPEG +n03372029_13728.JPEG +n04099969_4902.JPEG +n03532672_5273.JPEG +n03197337_9976.JPEG +n13037406_3831.JPEG +n04584207_7591.JPEG +n04243546_13108.JPEG +n03124170_6694.JPEG +n03530642_27796.JPEG +n02125311_1469.JPEG +n06596364_13641.JPEG +n03187595_3810.JPEG +n02992211_31515.JPEG +n03000134_2758.JPEG +n03661043_17463.JPEG +n04009552_7367.JPEG +n04033901_24149.JPEG +n04254680_5705.JPEG +n02009229_10003.JPEG +n03594734_33325.JPEG +n03388043_8999.JPEG +n04252077_4349.JPEG +n03857828_16513.JPEG +n02769748_31054.JPEG +n02483708_6761.JPEG +n02095314_2375.JPEG +n09332890_12442.JPEG +n13133613_3870.JPEG +n13037406_3294.JPEG +n03498962_5254.JPEG +n04612504_632.JPEG +n02172182_16114.JPEG +n02391049_8291.JPEG +n03478589_10891.JPEG +n02108551_4317.JPEG +n02687172_1823.JPEG +n04562935_2758.JPEG +n12768682_42077.JPEG +n01820546_6579.JPEG +n02105162_4321.JPEG +n03388549_3641.JPEG +n04442312_7870.JPEG +n09332890_2574.JPEG +n02442845_30954.JPEG +n04562935_2257.JPEG +n03777754_3181.JPEG +n02979186_1504.JPEG +n03131574_4743.JPEG +n04317175_4132.JPEG +n02910353_8238.JPEG +n04204347_2618.JPEG +n02105505_2328.JPEG +n01729322_4127.JPEG +n03041632_36806.JPEG +n01872401_3135.JPEG +n02279972_14318.JPEG +n03534580_11643.JPEG +n02950826_18715.JPEG +n02133161_565.JPEG +n07860988_43458.JPEG +n04120489_2236.JPEG +n04557648_109.JPEG +n02408429_7412.JPEG +n03481172_15734.JPEG +n02894605_47267.JPEG +n02104029_4696.JPEG +n03967562_26369.JPEG +n02494079_8983.JPEG +n01748264_5693.JPEG +n02992529_25669.JPEG +n02676566_4789.JPEG +n03868242_4673.JPEG +n02328150_14272.JPEG +n02114548_6413.JPEG +n06794110_2303.JPEG +n02071294_2747.JPEG +n09468604_110208.JPEG +n03670208_14806.JPEG +n02396427_19311.JPEG +n03947888_10882.JPEG +n03777754_8171.JPEG +n03032252_99439.JPEG +n04525305_1489.JPEG +n01494475_5380.JPEG +n03110669_8645.JPEG +n03594734_9063.JPEG +n02489166_11861.JPEG +n02948072_9031.JPEG +n03710193_17257.JPEG +n02037110_3804.JPEG +n09468604_4070.JPEG +n02095570_9081.JPEG +n13037406_9064.JPEG +n02106550_11748.JPEG +n09229709_45104.JPEG +n02088364_8233.JPEG +n03384352_1798.JPEG +n01616318_13378.JPEG +n03196217_8339.JPEG +n03657121_2809.JPEG +n03250847_7907.JPEG +n04356056_40917.JPEG +n03782006_7683.JPEG +n04033995_2425.JPEG +n03337140_35068.JPEG +n02492660_1498.JPEG +n03673027_9550.JPEG +n01748264_20234.JPEG +n07697537_30165.JPEG +n02488291_3907.JPEG +n02231487_6564.JPEG +n01629819_20561.JPEG +n03998194_777.JPEG +n04200800_24253.JPEG +n03627232_16963.JPEG +n02834397_2680.JPEG +n02825657_992.JPEG +n04435653_8405.JPEG +n02120505_14891.JPEG +n03584829_8284.JPEG +n02917067_1434.JPEG +n02437616_11743.JPEG +n02909870_26424.JPEG +n02317335_12911.JPEG +n02415577_823.JPEG +n01773797_9303.JPEG +n02093428_5635.JPEG +n02835271_12871.JPEG +n03179701_2224.JPEG +n03868863_12067.JPEG +n03673027_1406.JPEG +n03109150_15097.JPEG +n03871628_6640.JPEG +n12144580_2473.JPEG +n02101388_11277.JPEG +n03000684_9978.JPEG +n04154565_32060.JPEG +n03814906_49058.JPEG +n03791053_27364.JPEG +n07613480_15859.JPEG +n02837789_15927.JPEG +n04201297_9054.JPEG +n01770081_6527.JPEG +n02730930_5434.JPEG +n02814860_14122.JPEG +n03840681_18240.JPEG +n04606251_8836.JPEG +n03866082_10137.JPEG +n03485794_501.JPEG +n02879718_9172.JPEG +n04596742_22181.JPEG +n01819313_824.JPEG +n01688243_3399.JPEG +n01980166_9253.JPEG +n03887697_8644.JPEG +n01630670_1774.JPEG +n03379051_778.JPEG +n02276258_8604.JPEG +n02086240_5529.JPEG +n07714571_4031.JPEG +n02206856_80.JPEG +n02727426_18637.JPEG +n02443484_9451.JPEG +n02094114_871.JPEG +n02089973_97.JPEG +n02105641_6697.JPEG +n04111531_20914.JPEG +n03272010_9697.JPEG +n02363005_19684.JPEG +n02280649_1297.JPEG +n03461385_29757.JPEG +n04141975_11755.JPEG +n04423845_46662.JPEG +n02422699_3947.JPEG +n04149813_17210.JPEG +n02099267_19665.JPEG +n02090379_3707.JPEG +n03874293_2956.JPEG +n07579787_16792.JPEG +n03291819_5053.JPEG +n03958227_1850.JPEG +n01531178_7200.JPEG +n03942813_4821.JPEG +n09332890_8405.JPEG +n03584254_6286.JPEG +n03400231_14531.JPEG +n02692877_3951.JPEG +n02917067_1743.JPEG +n02487347_20328.JPEG +n02115641_13237.JPEG +n03314780_7846.JPEG +n02492660_21866.JPEG +n02129165_11737.JPEG +n02098286_2376.JPEG +n07734744_1397.JPEG +n01914609_19095.JPEG +n02099849_4784.JPEG +n02097209_2444.JPEG +n07717410_3872.JPEG +n07836838_5053.JPEG +n04081281_4160.JPEG +n04120489_3775.JPEG +n02783161_13247.JPEG +n02835271_22549.JPEG +n01693334_6242.JPEG +n04509417_764.JPEG +n02892767_10959.JPEG +n03042490_15730.JPEG +n02769748_40336.JPEG +n03759954_12416.JPEG +n01843383_3274.JPEG +n04428191_38659.JPEG +n04081281_19823.JPEG +n03992509_1488.JPEG +n01518878_1432.JPEG +n02391049_58.JPEG +n03133878_7183.JPEG +n07760859_970.JPEG +n03733805_1950.JPEG +n07753592_16162.JPEG +n04579145_288.JPEG +n02514041_12390.JPEG +n02514041_15458.JPEG +n02676566_4391.JPEG +n02096437_6791.JPEG +n03916031_5469.JPEG +n07614500_1706.JPEG +n02950826_35700.JPEG +n01514859_3688.JPEG +n07718747_11346.JPEG +n01873310_36.JPEG +n01514859_6838.JPEG +n01667778_11332.JPEG +n03902125_5196.JPEG +n01669191_2682.JPEG +n01665541_6361.JPEG +n02096177_12850.JPEG +n04040759_14496.JPEG +n02667093_9387.JPEG +n01955084_881.JPEG +n03902125_13269.JPEG +n02277742_23593.JPEG +n04252225_15285.JPEG +n02236044_16865.JPEG +n13044778_791.JPEG +n02988304_5630.JPEG +n02108422_10775.JPEG +n02814860_29537.JPEG +n02264363_12773.JPEG +n04355338_20541.JPEG +n04509417_6562.JPEG +n03016953_30269.JPEG +n04019541_27610.JPEG +n03133878_14199.JPEG +n10565667_2117.JPEG +n02098286_2331.JPEG +n01978287_4659.JPEG +n09835506_14942.JPEG +n01877812_7231.JPEG +n02950826_18298.JPEG +n03325584_13489.JPEG +n04523525_19113.JPEG +n02437616_259.JPEG +n01692333_1826.JPEG +n04372370_23915.JPEG +n02422699_3659.JPEG +n03000247_34749.JPEG +n04118538_1510.JPEG +n03216828_11547.JPEG +n03478589_1615.JPEG +n02814533_40350.JPEG +n01981276_6333.JPEG +n02361337_7254.JPEG +n02093428_10807.JPEG +n04009552_16114.JPEG +n02106550_1532.JPEG +n02097298_2413.JPEG +n02110063_11838.JPEG +n02793495_3725.JPEG +n03956157_11873.JPEG +n03976657_13709.JPEG +n04009552_9773.JPEG +n02447366_1653.JPEG +n04579145_4598.JPEG +n02174001_6338.JPEG +n02807133_12164.JPEG +n03976467_12057.JPEG +n02100877_762.JPEG +n03786901_17538.JPEG +n04579145_1539.JPEG +n01665541_10415.JPEG +n01776313_11995.JPEG +n03942813_10349.JPEG +n04536866_20038.JPEG +n03016953_11163.JPEG +n02791124_4155.JPEG +n03902125_11999.JPEG +n04372370_25742.JPEG +n02090622_6204.JPEG +n02641379_15148.JPEG +n03393912_9716.JPEG +n03109150_25194.JPEG +n01582220_4248.JPEG +n02127052_19058.JPEG +n04026417_12106.JPEG +n01742172_1652.JPEG +n02106662_6841.JPEG +n02107312_312.JPEG +n03877845_3466.JPEG +n03958227_5221.JPEG +n03944341_10043.JPEG +n03691459_42191.JPEG +n03792782_13110.JPEG +n07615774_22687.JPEG +n03670208_26344.JPEG +n03764736_24083.JPEG +n03393912_13387.JPEG +n02441942_5660.JPEG +n02058221_34990.JPEG +n04067472_7287.JPEG +n02025239_12125.JPEG +n07718747_3292.JPEG +n02094258_448.JPEG +n01631663_7307.JPEG +n03529860_4119.JPEG +n01669191_754.JPEG +n04209239_6851.JPEG +n02641379_11763.JPEG +n04285008_1584.JPEG +n02093859_2093.JPEG +n02128757_8434.JPEG +n06794110_5904.JPEG +n04141975_9049.JPEG +n02321529_4449.JPEG +n02074367_1117.JPEG +n04192698_6926.JPEG +n02447366_11388.JPEG +n03045698_2542.JPEG +n03400231_6689.JPEG +n06874185_10011.JPEG +n02804610_20314.JPEG +n02101388_10741.JPEG +n01855032_8125.JPEG +n03742115_1081.JPEG +n04266014_6899.JPEG +n02056570_45.JPEG +n04487394_23586.JPEG +n01910747_962.JPEG +n01644900_10011.JPEG +n07892512_3652.JPEG +n01629819_2890.JPEG +n02108551_491.JPEG +n02137549_20403.JPEG +n06359193_41268.JPEG +n03220513_17876.JPEG +n02093647_529.JPEG +n03970156_44478.JPEG +n02488291_2507.JPEG +n03887697_5478.JPEG +n02454379_10165.JPEG +n04606251_10020.JPEG +n01910747_8265.JPEG +n03529860_9816.JPEG +n02091032_8310.JPEG +n04540053_13854.JPEG +n02009912_3025.JPEG +n04033995_4166.JPEG +n02093428_18376.JPEG +n07860988_12647.JPEG +n03637318_9404.JPEG +n03788365_1062.JPEG +n02883205_21848.JPEG +n02415577_7729.JPEG +n04479046_2048.JPEG +n03095699_29413.JPEG +n03443371_7966.JPEG +n04254777_9051.JPEG +n04235860_8072.JPEG +n02099429_4679.JPEG +n04326547_19106.JPEG +n02125311_9318.JPEG +n01629819_14087.JPEG +n03742115_9613.JPEG +n03544143_11837.JPEG +n11939491_26836.JPEG +n01914609_889.JPEG +n02791124_3713.JPEG +n04399382_1007.JPEG +n01729977_4372.JPEG +n02795169_4087.JPEG +n02102480_8135.JPEG +n03670208_13068.JPEG +n04273569_23162.JPEG +n02111277_10167.JPEG +n01742172_8838.JPEG +n04325704_1528.JPEG +n03961711_12654.JPEG +n02098413_1765.JPEG +n02481823_16160.JPEG +n01871265_2741.JPEG +n03594945_19489.JPEG +n02112018_9403.JPEG +n02488291_2564.JPEG +n03947888_71.JPEG +n04552348_10208.JPEG +n02108422_2480.JPEG +n03832673_22131.JPEG +n02655020_13765.JPEG +n04552348_432.JPEG +n02397096_21850.JPEG +n02110185_6704.JPEG +n02028035_776.JPEG +n02105855_11198.JPEG +n03891251_4948.JPEG +n02894605_61478.JPEG +n04548280_8424.JPEG +n01978287_339.JPEG +n02389026_15081.JPEG +n04111531_20511.JPEG +n03961711_9193.JPEG +n02493793_5127.JPEG +n01824575_5068.JPEG +n02108915_11897.JPEG +n02130308_11548.JPEG +n02028035_2354.JPEG +n02125311_36651.JPEG +n02481823_4037.JPEG +n03884397_11387.JPEG +n03384352_19657.JPEG +n02727426_2455.JPEG +n02056570_7925.JPEG +n04099969_34525.JPEG +n02497673_2877.JPEG +n03271574_3088.JPEG +n02028035_28033.JPEG +n03929855_2611.JPEG +n02730930_13450.JPEG +n03394916_42786.JPEG +n01622779_12109.JPEG +n02100236_3683.JPEG +n03445777_4878.JPEG +n03710721_3852.JPEG +n02100877_14945.JPEG +n03763968_1913.JPEG +n02102973_5654.JPEG +n01795545_6925.JPEG +n01665541_20849.JPEG +n01829413_7606.JPEG +n02422106_1866.JPEG +n03804744_40932.JPEG +n04153751_6398.JPEG +n04141327_399.JPEG +n03594945_9544.JPEG +n02841315_24015.JPEG +n02101556_1871.JPEG +n02319095_6926.JPEG +n07716358_25260.JPEG +n04005630_114254.JPEG +n01990800_9217.JPEG +n03527444_6980.JPEG +n04485082_1896.JPEG +n07718747_5872.JPEG +n03041632_5911.JPEG +n07614500_108554.JPEG +n02802426_9404.JPEG +n03998194_11181.JPEG +n03196217_3909.JPEG +n12998815_1747.JPEG +n02106550_6954.JPEG +n04486054_9172.JPEG +n02894605_24721.JPEG +n04317175_1603.JPEG +n02101388_5214.JPEG +n02009912_6896.JPEG +n02106166_271.JPEG +n02793495_23221.JPEG +n03929855_1805.JPEG +n03467068_9273.JPEG +n02840245_5904.JPEG +n01560419_4574.JPEG +n04041544_37679.JPEG +n03314780_16534.JPEG +n03016953_16628.JPEG +n01968897_3065.JPEG +n02690373_13029.JPEG +n03868242_8658.JPEG +n10565667_9009.JPEG +n01694178_4922.JPEG +n03924679_5840.JPEG +n01817953_13359.JPEG +n02444819_16331.JPEG +n02108915_9664.JPEG +n03467068_7645.JPEG +n03791053_29325.JPEG +n04366367_4339.JPEG +n02669723_900.JPEG +n02776631_92890.JPEG +n02793495_5349.JPEG +n03691459_57562.JPEG +n02123394_2870.JPEG +n03085013_4814.JPEG +n04591157_7183.JPEG +n09472597_7037.JPEG +n04505470_4973.JPEG +n02909870_40640.JPEG +n07734744_11211.JPEG +n04273569_23140.JPEG +n04153751_8760.JPEG +n02971356_13606.JPEG +n03794056_19144.JPEG +n03673027_4960.JPEG +n07836838_28911.JPEG +n07584110_2630.JPEG +n03196217_5618.JPEG +n03595614_25677.JPEG +n03837869_1213.JPEG +n02877765_14174.JPEG +n03207743_19914.JPEG +n02088094_3956.JPEG +n10148035_21107.JPEG +n03843555_862.JPEG +n04392985_450.JPEG +n02114855_11691.JPEG +n03478589_4931.JPEG +n06785654_2644.JPEG +n01855032_518.JPEG +n04311174_4869.JPEG +n02112706_2624.JPEG +n01531178_7914.JPEG +n02607072_2474.JPEG +n04311004_4726.JPEG +n03085013_23277.JPEG +n02951585_13253.JPEG +n03947888_16768.JPEG +n04141975_29572.JPEG +n02231487_2321.JPEG +n02128757_4673.JPEG +n02276258_10635.JPEG +n02087046_5756.JPEG +n01797886_19001.JPEG +n04532106_5203.JPEG +n04273569_27372.JPEG +n03692522_13227.JPEG +n04067472_27773.JPEG +n03345487_9123.JPEG +n02086910_4260.JPEG +n02860847_9221.JPEG +n02098105_2740.JPEG +n03388549_12743.JPEG +n02892201_5769.JPEG +n03814639_12436.JPEG +n04613696_6792.JPEG +n02980441_1819.JPEG +n02105412_6429.JPEG +n12620546_18597.JPEG +n03786901_17943.JPEG +n01614925_6175.JPEG +n02480855_9246.JPEG +n07697537_21030.JPEG +n02977058_25736.JPEG +n01689811_1957.JPEG +n07714990_14952.JPEG +n01855672_52735.JPEG +n03495258_6813.JPEG +n02361337_2341.JPEG +n03485794_1670.JPEG +n01740131_10753.JPEG +n02672831_19173.JPEG +n01729977_10095.JPEG +n02264363_7709.JPEG +n04350905_36273.JPEG +n03776460_4893.JPEG +n02108551_5887.JPEG +n02483708_7309.JPEG +n01698640_2203.JPEG +n03379051_6474.JPEG +n02168699_191.JPEG +n03930630_13054.JPEG +n01872401_4797.JPEG +n02364673_19460.JPEG +n02002556_4102.JPEG +n03014705_40471.JPEG +n01981276_16039.JPEG +n03769881_5761.JPEG +n03983396_20430.JPEG +n03180011_6184.JPEG +n03496892_6705.JPEG +n02088364_174.JPEG +n02484975_10824.JPEG +n04367480_27072.JPEG +n02974003_4054.JPEG +n03495258_14874.JPEG +n03895866_55253.JPEG +n03602883_18507.JPEG +n02087046_7002.JPEG +n04005630_49056.JPEG +n02328150_7472.JPEG +n01955084_8319.JPEG +n02808304_6647.JPEG +n02097298_9755.JPEG +n04131690_14771.JPEG +n04239074_28446.JPEG +n02086910_16826.JPEG +n04542943_1621.JPEG +n02085620_4195.JPEG +n02791270_2864.JPEG +n03895866_2617.JPEG +n01950731_16625.JPEG +n04525305_10452.JPEG +n04465501_13859.JPEG +n03127925_8919.JPEG +n04458633_4319.JPEG +n03529860_234.JPEG +n02108422_5490.JPEG +n02504013_3300.JPEG +n04149813_7484.JPEG +n03930630_18435.JPEG +n03814906_13221.JPEG +n02484975_13620.JPEG +n01491361_58.JPEG +n02119022_372.JPEG +n03676483_23949.JPEG +n02107142_15810.JPEG +n02172182_1352.JPEG +n02086079_7853.JPEG +n12144580_6171.JPEG +n04557648_11046.JPEG +n02799071_5920.JPEG +n12620546_45528.JPEG +n07720875_10635.JPEG +n03787032_1758.JPEG +n01728920_4971.JPEG +n01537544_17799.JPEG +n03476991_15134.JPEG +n06596364_1497.JPEG +n04542943_3979.JPEG +n07768694_4549.JPEG +n04525305_10231.JPEG +n03777568_10132.JPEG +n04525038_4824.JPEG +n03259280_5729.JPEG +n03891332_3251.JPEG +n04507155_2551.JPEG +n01644900_10004.JPEG +n01644373_1389.JPEG +n04465501_538.JPEG +n04429376_45082.JPEG +n13052670_2868.JPEG +n07684084_5358.JPEG +n03272010_2411.JPEG +n07583066_409.JPEG +n04133789_5528.JPEG +n03394916_1594.JPEG +n02793495_9936.JPEG +n03481172_4255.JPEG +n02454379_6843.JPEG +n03344393_6349.JPEG +n04201297_3284.JPEG +n04147183_9563.JPEG +n03425413_13963.JPEG +n01729977_12349.JPEG +n02125311_5770.JPEG +n04081281_24219.JPEG +n04005630_53589.JPEG +n01665541_17228.JPEG +n04517823_31231.JPEG +n07715103_2519.JPEG +n01518878_21304.JPEG +n03676483_6657.JPEG +n03995372_8178.JPEG +n03544143_1136.JPEG +n04553703_16432.JPEG +n07730033_11268.JPEG +n02086910_881.JPEG +n04311174_9298.JPEG +n02791124_5089.JPEG +n01532829_16383.JPEG +n02102318_8365.JPEG +n03000134_1517.JPEG +n02797295_10532.JPEG +n02077923_11274.JPEG +n04041544_2995.JPEG +n02490219_2516.JPEG +n04542943_600.JPEG +n01843383_2701.JPEG +n12144580_1891.JPEG +n04336792_5988.JPEG +n02963159_1165.JPEG +n04604644_7722.JPEG +n03930313_914.JPEG +n09468604_32426.JPEG +n02006656_4920.JPEG +n07714990_718.JPEG +n01644373_8802.JPEG +n02013706_19220.JPEG +n01665541_5468.JPEG +n02110341_9000.JPEG +n02489166_11890.JPEG +n01498041_3536.JPEG +n03825788_14167.JPEG +n03721384_6901.JPEG +n02281787_2513.JPEG +n02492660_78.JPEG +n02087046_7194.JPEG +n03733131_10816.JPEG +n03447721_25180.JPEG +n01990800_7213.JPEG +n02109525_3662.JPEG +n02107908_6573.JPEG +n02807133_1336.JPEG +n02667093_6789.JPEG +n02483362_8812.JPEG +n03733281_20383.JPEG +n03908714_14588.JPEG +n04033901_41858.JPEG +n03314780_4993.JPEG +n01689811_6214.JPEG +n01883070_4480.JPEG +n02486410_5663.JPEG +n04456115_17278.JPEG +n03642806_13241.JPEG +n02916936_11676.JPEG +n04357314_9109.JPEG +n03841143_14185.JPEG +n04201297_15841.JPEG +n01807496_9294.JPEG +n02481823_21984.JPEG +n02840245_5424.JPEG +n07716906_2328.JPEG +n01755581_28291.JPEG +n04040759_1495.JPEG +n03595614_12265.JPEG +n04554684_28897.JPEG +n10565667_16345.JPEG +n03837869_4079.JPEG +n02107312_7418.JPEG +n02488702_6389.JPEG +n02100877_9375.JPEG +n13052670_6025.JPEG +n02097298_12024.JPEG +n04523525_11582.JPEG +n04273569_15600.JPEG +n02119022_1536.JPEG +n01798484_12689.JPEG +n07753113_33311.JPEG +n04005630_80839.JPEG +n03916031_5079.JPEG +n02099429_4756.JPEG +n04317175_2824.JPEG +n03538406_137.JPEG +n01924916_11214.JPEG +n02112018_5711.JPEG +n01807496_12152.JPEG +n03954731_37092.JPEG +n04532670_9824.JPEG +n04044716_11805.JPEG +n07714990_4608.JPEG +n02134418_4110.JPEG +n03483316_19354.JPEG +n03866082_1421.JPEG +n03000684_272.JPEG +n03692522_15209.JPEG +n04252225_14728.JPEG +n02138441_7280.JPEG +n07742313_4888.JPEG +n01773549_2852.JPEG +n12144580_975.JPEG +n03873416_14115.JPEG +n02107908_10153.JPEG +n04009552_6827.JPEG +n03710193_4314.JPEG +n01601694_19664.JPEG +n12620546_48525.JPEG +n02093859_2062.JPEG +n03337140_12128.JPEG +n03089624_8123.JPEG +n02791124_7467.JPEG +n04273569_5146.JPEG +n07749582_11976.JPEG +n02786058_9536.JPEG +n02096051_1517.JPEG +n02137549_3913.JPEG +n02415577_9384.JPEG +n02808304_15162.JPEG +n01776313_39475.JPEG +n01776313_19185.JPEG +n02109047_379.JPEG +n03388183_15497.JPEG +n02114548_22567.JPEG +n02114548_5875.JPEG +n03075370_2581.JPEG +n02777292_9881.JPEG +n03065424_16211.JPEG +n03496892_15476.JPEG +n02089078_5387.JPEG +n02930766_12576.JPEG +n02391049_7038.JPEG +n04270147_9978.JPEG +n01828970_5056.JPEG +n04467665_41.JPEG +n04162706_20399.JPEG +n02108551_14608.JPEG +n04152593_52153.JPEG +n03627232_12796.JPEG +n02111889_2095.JPEG +n01558993_69.JPEG +n07718472_25278.JPEG +n04044716_19021.JPEG +n03314780_15577.JPEG +n02701002_114.JPEG +n04209239_8939.JPEG +n03590841_4938.JPEG +n04560804_2085.JPEG +n02817516_18228.JPEG +n02169497_4536.JPEG +n03868242_2725.JPEG +n02814533_34893.JPEG +n03376595_9658.JPEG +n03935335_9299.JPEG +n02105855_16360.JPEG +n07873807_8335.JPEG +n02264363_8400.JPEG +n02483708_2555.JPEG +n02167151_6723.JPEG +n03532672_40861.JPEG +n01796340_5464.JPEG +n01980166_1798.JPEG +n02690373_6913.JPEG +n02177972_3911.JPEG +n03249569_48769.JPEG +n09428293_31489.JPEG +n03485794_33074.JPEG +n03710193_478.JPEG +n02099601_854.JPEG +n03000684_14593.JPEG +n09835506_10992.JPEG +n01692333_4444.JPEG +n04252077_14902.JPEG +n03788365_11937.JPEG +n07684084_172.JPEG +n01770393_9742.JPEG +n01773549_4253.JPEG +n03661043_9403.JPEG +n04458633_8428.JPEG +n02963159_9028.JPEG +n04118776_16924.JPEG +n01924916_6956.JPEG +n02112018_7080.JPEG +n02457408_10119.JPEG +n04023962_15715.JPEG +n02883205_23017.JPEG +n01729322_6015.JPEG +n03742115_14302.JPEG +n02804610_9233.JPEG +n03871628_261.JPEG +n04270147_3282.JPEG +n03661043_2262.JPEG +n02100583_6635.JPEG +n03980874_2933.JPEG +n02168699_8273.JPEG +n01820546_4251.JPEG +n02606052_2959.JPEG +n03729826_10243.JPEG +n04070727_4706.JPEG +n02107142_52017.JPEG +n02097474_3691.JPEG +n04515003_15866.JPEG +n02086079_17603.JPEG +n03649909_24480.JPEG +n04239074_13424.JPEG +n03208938_10699.JPEG +n04004767_11338.JPEG +n01749939_2760.JPEG +n02669723_14396.JPEG +n03028079_95473.JPEG +n02395406_5086.JPEG +n03085013_23635.JPEG +n03908714_9371.JPEG +n03445777_6396.JPEG +n02096437_135.JPEG \ No newline at end of file diff --git a/main_finetune.py b/main_finetune.py new file mode 100644 index 0000000..a665194 --- /dev/null +++ b/main_finetune.py @@ -0,0 +1,389 @@ +# ------------------------------------------------------------------------ +# SiameseIM +# Copyright (c) SenseTime. All Rights Reserved. +# ------------------------------------------------------------------------ +# Modified from MAE (https://github.com/facebookresearch/mae) +# Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved. +# ------------------------------------------------------------------------ +# References: +# BEiT: https://github.com/microsoft/unilm/tree/master/beit +# DeiT: https://github.com/facebookresearch/deit +# ------------------------------------------------------------------------ + + +import argparse +import datetime +import json +import numpy as np +import os +import time +from pathlib import Path + +import torch +import torch.backends.cudnn as cudnn +from torch.utils.tensorboard import SummaryWriter +import torchvision.datasets as datasets + +import timm +assert timm.__version__ == "0.6.12" # version check +from timm.models.layers import trunc_normal_ +from timm.data.mixup import Mixup +from timm.loss import LabelSmoothingCrossEntropy, SoftTargetCrossEntropy + +import util.lr_decay as lrd +import util.misc as misc +from util.datasets import build_transform +from util.pos_embed import interpolate_pos_embed +from util.misc import NativeScalerWithGradNormCount as NativeScaler +import models_vit +from engine_finetune import train_one_epoch, evaluate + + +def get_args_parser(): + parser = argparse.ArgumentParser('MAE fine-tuning for image classification', add_help=False) + parser.add_argument('--batch_size', default=64, type=int, + help='Batch size per GPU (effective batch size is batch_size * accum_iter * # gpus') + parser.add_argument('--epochs', default=50, type=int) + parser.add_argument('--accum_iter', default=1, type=int, + help='Accumulate gradient iterations (for increasing the effective batch size under memory constraints)') + + # Model parameters + parser.add_argument('--model', default='vit_large_patch16', type=str, metavar='MODEL', + help='Name of model to train') + + parser.add_argument('--input_size', default=224, type=int, + help='images input size') + + parser.add_argument('--drop_path', type=float, default=0.1, metavar='PCT', + help='Drop path rate (default: 0.1)') + + # Optimizer parameters + parser.add_argument('--clip_grad', type=float, default=None, metavar='NORM', + help='Clip gradient norm (default: None, no clipping)') + parser.add_argument('--weight_decay', type=float, default=0.05, + help='weight decay (default: 0.05)') + + parser.add_argument('--lr', type=float, default=None, metavar='LR', + help='learning rate (absolute lr)') + parser.add_argument('--blr', type=float, default=1e-3, metavar='LR', + help='base learning rate: absolute_lr = base_lr * total_batch_size / 256') + parser.add_argument('--layer_decay', type=float, default=0.75, + help='layer-wise lr decay from ELECTRA/BEiT') + + parser.add_argument('--min_lr', type=float, default=1e-6, metavar='LR', + help='lower lr bound for cyclic schedulers that hit 0') + + parser.add_argument('--warmup_epochs', type=int, default=5, metavar='N', + help='epochs to warmup LR') + + # Augmentation parameters + parser.add_argument('--color_jitter', type=float, default=None, metavar='PCT', + help='Color jitter factor (enabled only when not using Auto/RandAug)') + parser.add_argument('--aa', type=str, default='rand-m9-mstd0.5-inc1', metavar='NAME', + help='Use AutoAugment policy. "v0" or "original". " + "(default: rand-m9-mstd0.5-inc1)'), + parser.add_argument('--smoothing', type=float, default=0.1, + help='Label smoothing (default: 0.1)') + + # * Random Erase params + parser.add_argument('--reprob', type=float, default=0.25, metavar='PCT', + help='Random erase prob (default: 0.25)') + parser.add_argument('--remode', type=str, default='pixel', + help='Random erase mode (default: "pixel")') + parser.add_argument('--recount', type=int, default=1, + help='Random erase count (default: 1)') + parser.add_argument('--resplit', action='store_true', default=False, + help='Do not random erase first (clean) augmentation split') + + # * Mixup params + parser.add_argument('--mixup', type=float, default=0, + help='mixup alpha, mixup enabled if > 0.') + parser.add_argument('--cutmix', type=float, default=0, + help='cutmix alpha, cutmix enabled if > 0.') + parser.add_argument('--cutmix_minmax', type=float, nargs='+', default=None, + help='cutmix min/max ratio, overrides alpha and enables cutmix if set (default: None)') + parser.add_argument('--mixup_prob', type=float, default=1.0, + help='Probability of performing mixup or cutmix when either/both is enabled') + parser.add_argument('--mixup_switch_prob', type=float, default=0.5, + help='Probability of switching to cutmix when both mixup and cutmix enabled') + parser.add_argument('--mixup_mode', type=str, default='batch', + help='How to apply mixup/cutmix params. Per "batch", "pair", or "elem"') + + # * Finetuning params + parser.add_argument('--finetune', default='', + help='finetune from checkpoint') + parser.add_argument('--global_pool', action='store_true') + parser.set_defaults(global_pool=True) + parser.add_argument('--cls_token', action='store_false', dest='global_pool', + help='Use class token instead of global pool for classification') + + # Dataset parameters + parser.add_argument('--data_path', default='/datasets01/imagenet_full_size/061417/', type=str, + help='dataset path') + parser.add_argument('--nb_classes', default=1000, type=int, + help='number of the classification types') + parser.add_argument('--use_tcs_dataset', default=False, action='store_true') + + parser.add_argument('--output_dir', default='./output_dir', + help='path where to save, empty for no saving') + parser.add_argument('--log_dir', default='./output_dir', + help='path where to tensorboard log') + parser.add_argument('--device', default='cuda', + help='device to use for training / testing') + parser.add_argument('--seed', default=0, type=int) + parser.add_argument('--resume', default='', + help='resume from checkpoint') + + parser.add_argument('--start_epoch', default=0, type=int, metavar='N', + help='start epoch') + parser.add_argument('--eval', action='store_true', + help='Perform evaluation only') + parser.add_argument('--dist_eval', action='store_true', default=False, + help='Enabling distributed evaluation (recommended during training for faster monitor') + parser.add_argument('--num_workers', default=10, type=int) + parser.add_argument('--pin_mem', action='store_true', + help='Pin CPU memory in DataLoader for more efficient (sometimes) transfer to GPU.') + parser.add_argument('--no_pin_mem', action='store_false', dest='pin_mem') + parser.set_defaults(pin_mem=True) + + # distributed training parameters + parser.add_argument('--world_size', default=1, type=int, + help='number of distributed processes') + parser.add_argument('--local_rank', default=-1, type=int) + parser.add_argument('--dist_on_itp', action='store_true') + parser.add_argument('--dist_url', default='env://', + help='url used to set up distributed training') + + parser.add_argument('--auto_resume', action='store_true', default=True) + parser.add_argument('--init_values', default=1.0, type=float) + + return parser + + +def main(args): + misc.init_distributed_mode(args) + + print('job dir: {}'.format(os.path.dirname(os.path.realpath(__file__)))) + print("{}".format(args).replace(', ', ',\n')) + + device = torch.device(args.device) + + # fix the seed for reproducibility + seed = args.seed + misc.get_rank() + torch.manual_seed(seed) + np.random.seed(seed) + + cudnn.benchmark = True + torch.backends.cuda.matmul.allow_tf32 = False + torch.backends.cudnn.allow_tf32 = False + + # build dataset + transform_train = build_transform(is_train=True, args=args) + transform_val = build_transform(is_train=False, args=args) + if not args.use_tcs_dataset: + dataset_train = datasets.ImageFolder(os.path.join(args.data_path, 'train'), transform=transform_train) + dataset_val = datasets.ImageFolder(os.path.join(args.data_path, 'val'), transform=transform_val) + else: + from util.tcs_datasets import ImagenetTCSDataset + dataset_train = ImagenetTCSDataset('train', + 's3://imagenet', + transform=transform_train, + use_tcs=True) + dataset_val = ImagenetTCSDataset('val', + 's3://imagenet', + transform=transform_val, + use_tcs=True) + + print(dataset_train) + print(dataset_val) + + if True: # args.distributed: + num_tasks = misc.get_world_size() + global_rank = misc.get_rank() + sampler_train = torch.utils.data.DistributedSampler( + dataset_train, num_replicas=num_tasks, rank=global_rank, shuffle=True + ) + print("Sampler_train = %s" % str(sampler_train)) + if args.dist_eval: + if len(dataset_val) % num_tasks != 0: + print('Warning: Enabling distributed evaluation with an eval dataset not divisible by process number. ' + 'This will slightly alter validation results as extra duplicate entries are added to achieve ' + 'equal num of samples per-process.') + sampler_val = torch.utils.data.DistributedSampler( + dataset_val, num_replicas=num_tasks, rank=global_rank, shuffle=True) # shuffle=True to reduce monitor bias + else: + sampler_val = torch.utils.data.SequentialSampler(dataset_val) + else: + sampler_train = torch.utils.data.RandomSampler(dataset_train) + sampler_val = torch.utils.data.SequentialSampler(dataset_val) + + if global_rank == 0 and args.log_dir is not None and not args.eval: + os.makedirs(args.log_dir, exist_ok=True) + log_writer = SummaryWriter(log_dir=args.log_dir) + else: + log_writer = None + + data_loader_train = torch.utils.data.DataLoader( + dataset_train, sampler=sampler_train, + batch_size=args.batch_size, + num_workers=args.num_workers, + pin_memory=args.pin_mem, + drop_last=True, + ) + + data_loader_val = torch.utils.data.DataLoader( + dataset_val, sampler=sampler_val, + batch_size=args.batch_size, + num_workers=args.num_workers, + pin_memory=args.pin_mem, + drop_last=False + ) + + # build mixup + mixup_fn = None + mixup_active = args.mixup > 0 or args.cutmix > 0. or args.cutmix_minmax is not None + if mixup_active: + print("Mixup is activated!") + mixup_fn = Mixup( + mixup_alpha=args.mixup, cutmix_alpha=args.cutmix, cutmix_minmax=args.cutmix_minmax, + prob=args.mixup_prob, switch_prob=args.mixup_switch_prob, mode=args.mixup_mode, + label_smoothing=args.smoothing, num_classes=args.nb_classes) + + # build model + model = models_vit.__dict__[args.model]( + num_classes=args.nb_classes, + drop_path_rate=args.drop_path, + global_pool=args.global_pool, + init_values=args.init_values if args.init_values != 1.0 else None, + ) + + # load ckpt + if args.finetune and not args.eval: + checkpoint = torch.load(args.finetune, map_location='cpu') + print("Load pre-trained checkpoint from: %s" % args.finetune) + checkpoint_model = checkpoint['model'] + state_dict = model.state_dict() + for k in ['head.weight', 'head.bias']: + if k in checkpoint_model and checkpoint_model[k].shape != state_dict[k].shape: + print(f"Removing key {k} from pretrained checkpoint") + del checkpoint_model[k] + + # interpolate position embedding + interpolate_pos_embed(model, checkpoint_model) + + # load pre-trained model + msg = model.load_state_dict(checkpoint_model, strict=False) + print(msg) + + if args.global_pool: + assert set(msg.missing_keys) == {'head.weight', 'head.bias', 'fc_norm.weight', 'fc_norm.bias'} + else: + assert set(msg.missing_keys) == {'head.weight', 'head.bias'} + + # manually initialize fc layer + if hasattr(model, 'head'): + trunc_normal_(model.head.weight, std=2e-5) + + model.to(device) + + model_without_ddp = model + n_parameters = sum(p.numel() for p in model.parameters() if p.requires_grad) + + print("Model = %s" % str(model_without_ddp)) + print('number of params (M): %.2f' % (n_parameters / 1.e6)) + + eff_batch_size = args.batch_size * args.accum_iter * misc.get_world_size() + + if args.lr is None: # only base_lr is specified + args.lr = args.blr * eff_batch_size / 256 + + print("base lr: %.2e" % (args.lr * 256 / eff_batch_size)) + print("actual lr: %.2e" % args.lr) + + print("accumulate grad iterations: %d" % args.accum_iter) + print("effective batch size: %d" % eff_batch_size) + + if args.distributed: + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) + model_without_ddp = model.module + + # build optimizer with layer-wise lr decay (lrd) + param_groups = lrd.param_groups_lrd(model_without_ddp, args.weight_decay, + no_weight_decay_list=model_without_ddp.no_weight_decay(), + layer_decay=args.layer_decay + ) + optimizer = torch.optim.AdamW(param_groups, lr=args.lr) + loss_scaler = NativeScaler() + + if mixup_fn is not None: + # smoothing is handled with mixup label transform + criterion = SoftTargetCrossEntropy() + elif args.smoothing > 0.: + criterion = LabelSmoothingCrossEntropy(smoothing=args.smoothing) + else: + criterion = torch.nn.CrossEntropyLoss() + + print("criterion = %s" % str(criterion)) + + # misc.load_model(args=args, model_without_ddp=model_without_ddp, optimizer=optimizer, loss_scaler=loss_scaler) + misc.auto_load_model( + args=args, model_without_ddp=model_without_ddp, optimizer=optimizer, loss_scaler=loss_scaler) + + if args.eval: + test_stats = evaluate(data_loader_val, model, device) + print(f"Accuracy of the network on the {len(dataset_val)} test images: {test_stats['acc1']:.1f}%") + exit(0) + + # start training + print(f"Start training for {args.epochs} epochs") + start_time = time.time() + max_accuracy = 0.0 + for epoch in range(args.start_epoch, args.epochs): + if args.distributed: + data_loader_train.sampler.set_epoch(epoch) + train_stats = train_one_epoch( + model, criterion, data_loader_train, + optimizer, device, epoch, loss_scaler, + args.clip_grad, mixup_fn, + log_writer=log_writer, + args=args + ) + + # save model + if args.output_dir: + misc.save_model( + args=args, model=model, model_without_ddp=model_without_ddp, optimizer=optimizer, + loss_scaler=loss_scaler, epoch=epoch, latest=True) + + if (epoch+1)%1 == 0: + test_stats = evaluate(data_loader_val, model, device) + print(f"Accuracy of the network on the {len(dataset_val)} test images: {test_stats['acc1']:.1f}%") + max_accuracy = max(max_accuracy, test_stats["acc1"]) + print(f'Max accuracy: {max_accuracy:.2f}%') + + if log_writer is not None: + log_writer.add_scalar('perf/test_acc1', test_stats['acc1'], epoch) + log_writer.add_scalar('perf/test_acc5', test_stats['acc5'], epoch) + log_writer.add_scalar('perf/test_loss', test_stats['loss'], epoch) + + log_stats = {**{f'train_{k}': v for k, v in train_stats.items()}, + **{f'test_{k}': v for k, v in test_stats.items()}, + 'epoch': epoch, + 'n_parameters': n_parameters} + + if args.output_dir and misc.is_main_process(): + if log_writer is not None: + log_writer.flush() + with open(os.path.join(args.output_dir, "log.txt"), mode="a", encoding="utf-8") as f: + f.write(json.dumps(log_stats) + "\n") + + total_time = time.time() - start_time + total_time_str = str(datetime.timedelta(seconds=int(total_time))) + print('Training time {}'.format(total_time_str)) + + +if __name__ == '__main__': + args = get_args_parser() + args = args.parse_args() + if args.output_dir: + Path(args.output_dir).mkdir(parents=True, exist_ok=True) + main(args) diff --git a/main_linprobe.py b/main_linprobe.py new file mode 100644 index 0000000..a924bd0 --- /dev/null +++ b/main_linprobe.py @@ -0,0 +1,348 @@ +# ------------------------------------------------------------------------ +# SiameseIM +# Copyright (c) SenseTime. All Rights Reserved. +# ------------------------------------------------------------------------ +# Modified from MAE (https://github.com/facebookresearch/mae) +# Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved. +# ------------------------------------------------------------------------ +# References: +# MoCo v3: https://github.com/facebookresearch/moco-v3 +# DeiT: https://github.com/facebookresearch/deit +# ------------------------------------------------------------------------ + + +import argparse +import datetime +import json +import numpy as np +import os +import time +from pathlib import Path + +import torch +import torch.backends.cudnn as cudnn +from torch.utils.tensorboard import SummaryWriter +import torchvision.transforms as transforms +import torchvision.datasets as datasets + +import timm + +assert timm.__version__ == "0.6.12" # version check +from timm.models.layers import trunc_normal_ + +import util.misc as misc +from util.pos_embed import interpolate_pos_embed +from util.misc import NativeScalerWithGradNormCount as NativeScaler +from util.lars import LARS +from util.crop import RandomResizedCrop +import models_vit +from engine_finetune import train_one_epoch, evaluate + + +def get_args_parser(): + parser = argparse.ArgumentParser('MAE linear probing for image classification', add_help=False) + parser.add_argument('--batch_size', default=512, type=int, + help='Batch size per GPU (effective batch size is batch_size * accum_iter * # gpus') + parser.add_argument('--epochs', default=90, type=int) + parser.add_argument('--accum_iter', default=1, type=int, + help='Accumulate gradient iterations (for increasing the effective batch size under memory constraints)') + + # Model parameters + parser.add_argument('--model', default='vit_large_patch16', type=str, metavar='MODEL', + help='Name of model to train') + + # Optimizer parameters + parser.add_argument('--weight_decay', type=float, default=0, + help='weight decay (default: 0 for linear probe following MoCo v1)') + + parser.add_argument('--lr', type=float, default=None, metavar='LR', + help='learning rate (absolute lr)') + parser.add_argument('--blr', type=float, default=0.1, metavar='LR', + help='base learning rate: absolute_lr = base_lr * total_batch_size / 256') + + parser.add_argument('--min_lr', type=float, default=0., metavar='LR', + help='lower lr bound for cyclic schedulers that hit 0') + + parser.add_argument('--warmup_epochs', type=int, default=10, metavar='N', + help='epochs to warmup LR') + + # * Finetuning params + parser.add_argument('--finetune', default='', + help='finetune from checkpoint') + parser.add_argument('--global_pool', action='store_true') + parser.set_defaults(global_pool=False) + parser.add_argument('--cls_token', action='store_false', dest='global_pool', + help='Use class token instead of global pool for classification') + + # Dataset parameters + parser.add_argument('--data_path', default='/datasets01/imagenet_full_size/061417/', type=str, + help='dataset path') + parser.add_argument('--nb_classes', default=1000, type=int, + help='number of the classification types') + parser.add_argument('--use_tcs_dataset', default=False, action='store_true') + + parser.add_argument('--output_dir', default='./output_dir', + help='path where to save, empty for no saving') + parser.add_argument('--log_dir', default='./output_dir', + help='path where to tensorboard log') + parser.add_argument('--device', default='cuda', + help='device to use for training / testing') + parser.add_argument('--seed', default=0, type=int) + parser.add_argument('--resume', default='', + help='resume from checkpoint') + + parser.add_argument('--start_epoch', default=0, type=int, metavar='N', + help='start epoch') + parser.add_argument('--eval', action='store_true', + help='Perform evaluation only') + parser.add_argument('--dist_eval', action='store_true', default=False, + help='Enabling distributed evaluation (recommended during training for faster monitor') + parser.add_argument('--num_workers', default=10, type=int) + parser.add_argument('--pin_mem', action='store_true', + help='Pin CPU memory in DataLoader for more efficient (sometimes) transfer to GPU.') + parser.add_argument('--no_pin_mem', action='store_false', dest='pin_mem') + # parser.set_defaults(pin_mem=True) + + # distributed training parameters + parser.add_argument('--world_size', default=1, type=int, + help='number of distributed processes') + parser.add_argument('--local_rank', default=-1, type=int) + parser.add_argument('--dist_on_itp', action='store_true') + parser.add_argument('--dist_url', default='env://', + help='url used to set up distributed training') + + parser.add_argument('--auto_resume', action='store_true', default=True) + parser.add_argument('--init_values', default=1.0, type=float) + + return parser + + +def main(args): + misc.init_distributed_mode(args) + + print('job dir: {}'.format(os.path.dirname(os.path.realpath(__file__)))) + print("{}".format(args).replace(', ', ',\n')) + + device = torch.device(args.device) + + # fix the seed for reproducibility + seed = args.seed + misc.get_rank() + torch.manual_seed(seed) + np.random.seed(seed) + + cudnn.benchmark = True + torch.backends.cuda.matmul.allow_tf32 = False + torch.backends.cudnn.allow_tf32 = False + + # linear probe: weak augmentation + transform_train = transforms.Compose([ + RandomResizedCrop(224, interpolation=3), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])]) + transform_val = transforms.Compose([ + transforms.Resize(256, interpolation=3), + transforms.CenterCrop(224), + transforms.ToTensor(), + transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])]) + if not args.use_tcs_dataset: + dataset_train = datasets.ImageFolder(os.path.join(args.data_path, 'train'), transform=transform_train) + dataset_val = datasets.ImageFolder(os.path.join(args.data_path, 'val'), transform=transform_val) + else: # for internal use only + from util.tcs_datasets import ImagenetTCSDataset + dataset_train = ImagenetTCSDataset( + 'train', + 's3://imagenet', + use_tcs=True, + transform=transform_train) + dataset_val = ImagenetTCSDataset( + 'val', + 's3://imagenet', + use_tcs=True, + transform=transform_val) + print(dataset_train) + print(dataset_val) + + # build dataloader + if True: # args.distributed: + num_tasks = misc.get_world_size() + global_rank = misc.get_rank() + sampler_train = torch.utils.data.DistributedSampler( + dataset_train, num_replicas=num_tasks, rank=global_rank, shuffle=True + ) + print("Sampler_train = %s" % str(sampler_train)) + if args.dist_eval: + if len(dataset_val) % num_tasks != 0: + print('Warning: Enabling distributed evaluation with an eval dataset not divisible by process number. ' + 'This will slightly alter validation results as extra duplicate entries are added to achieve ' + 'equal num of samples per-process.') + sampler_val = torch.utils.data.DistributedSampler( + dataset_val, num_replicas=num_tasks, rank=global_rank, shuffle=True) # shuffle=True to reduce monitor bias + else: + sampler_val = torch.utils.data.SequentialSampler(dataset_val) + else: + sampler_train = torch.utils.data.RandomSampler(dataset_train) + sampler_val = torch.utils.data.SequentialSampler(dataset_val) + + data_loader_train = torch.utils.data.DataLoader( + dataset_train, sampler=sampler_train, + batch_size=args.batch_size, + num_workers=args.num_workers, + pin_memory=args.pin_mem, + drop_last=True, + ) + + data_loader_val = torch.utils.data.DataLoader( + dataset_val, sampler=sampler_val, + batch_size=args.batch_size, + num_workers=args.num_workers, + pin_memory=args.pin_mem, + drop_last=False + ) + + if global_rank == 0 and args.log_dir is not None and not args.eval: + os.makedirs(args.log_dir, exist_ok=True) + log_writer = SummaryWriter(log_dir=args.log_dir) + else: + log_writer = None + + # build model + model = models_vit.__dict__[args.model]( + num_classes=args.nb_classes, + global_pool=args.global_pool, + init_values=args.init_values if args.init_values != 1.0 else None, + drop_path_rate=0.0 + ) + + # load ckpt + if args.finetune and not args.eval: + checkpoint = torch.load(args.finetune, map_location='cpu') + + print("Load pre-trained checkpoint from: %s" % args.finetune) + checkpoint_model = checkpoint['model'] + + state_dict = model.state_dict() + for k in ['head.weight', 'head.bias']: + if k in checkpoint_model and checkpoint_model[k].shape != state_dict[k].shape: + print(f"Removing key {k} from pretrained checkpoint") + del checkpoint_model[k] + + # interpolate position embedding + interpolate_pos_embed(model, checkpoint_model) + + # load pre-trained model + msg = model.load_state_dict(checkpoint_model, strict=False) + print(msg) + + if args.global_pool: + assert set(msg.missing_keys) == {'head.weight', 'head.bias', 'fc_norm.weight', 'fc_norm.bias'} + else: + assert set(msg.missing_keys) == {'head.weight', 'head.bias'} + + # manually initialize fc layer: following MoCo v3 + trunc_normal_(model.head.weight, std=0.01) + + # for linear prob only + # hack: revise model's head with BN + # model.bn = torch.nn.BatchNorm1d(model.head.in_features, affine=False, eps=1e-6) + model.head = torch.nn.Sequential(torch.nn.BatchNorm1d(model.head.in_features, affine=False, eps=1e-6), model.head) + # freeze all but the head + for _, p in model.named_parameters(): + p.requires_grad = False + for _, p in model.head.named_parameters(): + p.requires_grad = True + + model.to(device) + + model_without_ddp = model + n_parameters = sum(p.numel() for p in model.parameters() if p.requires_grad) + + print("Model = %s" % str(model_without_ddp)) + print('number of params (M): %.2f' % (n_parameters / 1.e6)) + + eff_batch_size = args.batch_size * args.accum_iter * misc.get_world_size() + + if args.lr is None: # only base_lr is specified + args.lr = args.blr * eff_batch_size / 256 + + print("base lr: %.2e" % (args.lr * 256 / eff_batch_size)) + print("actual lr: %.2e" % args.lr) + + print("accumulate grad iterations: %d" % args.accum_iter) + print("effective batch size: %d" % eff_batch_size) + + if args.distributed: + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) + model_without_ddp = model.module + + # build optimizer + optimizer = LARS(model_without_ddp.head.parameters(), lr=args.lr, weight_decay=args.weight_decay) + print(optimizer) + loss_scaler = NativeScaler() + + criterion = torch.nn.CrossEntropyLoss() + + print("criterion = %s" % str(criterion)) + + # misc.load_model(args=args, model_without_ddp=model_without_ddp, optimizer=optimizer, loss_scaler=loss_scaler) + misc.auto_load_model(args=args, model_without_ddp=model_without_ddp, optimizer=optimizer, loss_scaler=loss_scaler) + + if args.eval: + test_stats = evaluate(data_loader_val, model, device) + print(f"Accuracy of the network on the {len(dataset_val)} test images: {test_stats['acc1']:.1f}%") + exit(0) + + # start training + print(f"Start training for {args.epochs} epochs") + start_time = time.time() + max_accuracy = 0.0 + for epoch in range(args.start_epoch, args.epochs): + if args.distributed: + data_loader_train.sampler.set_epoch(epoch) + train_stats = train_one_epoch( + model, criterion, data_loader_train, + optimizer, device, epoch, loss_scaler, + max_norm=None, + log_writer=log_writer, + args=args + ) + + # save ckpt + if args.output_dir: + misc.save_model( + args=args, model=model, model_without_ddp=model_without_ddp, optimizer=optimizer, + loss_scaler=loss_scaler, epoch=epoch, latest=True) + + if (epoch+1)%1 == 0: + test_stats = evaluate(data_loader_val, model, device) + print(f"Accuracy of the network on the {len(dataset_val)} test images: {test_stats['acc1']:.1f}%") + max_accuracy = max(max_accuracy, test_stats["acc1"]) + print(f'Max accuracy: {max_accuracy:.2f}%') + + if log_writer is not None: + log_writer.add_scalar('perf/test_acc1', test_stats['acc1'], epoch) + log_writer.add_scalar('perf/test_acc5', test_stats['acc5'], epoch) + log_writer.add_scalar('perf/test_loss', test_stats['loss'], epoch) + + log_stats = {**{f'train_{k}': v for k, v in train_stats.items()}, + **{f'test_{k}': v for k, v in test_stats.items()}, + 'epoch': epoch, + 'n_parameters': n_parameters} + + if args.output_dir and misc.is_main_process(): + if log_writer is not None: + log_writer.flush() + with open(os.path.join(args.output_dir, "log.txt"), mode="a", encoding="utf-8") as f: + f.write(json.dumps(log_stats) + "\n") + + total_time = time.time() - start_time + total_time_str = str(datetime.timedelta(seconds=int(total_time))) + print('Training time {}'.format(total_time_str)) + + +if __name__ == '__main__': + args = get_args_parser() + args = args.parse_args() + if args.output_dir: + Path(args.output_dir).mkdir(parents=True, exist_ok=True) + main(args) diff --git a/main_logistic.py b/main_logistic.py new file mode 100644 index 0000000..4799baa --- /dev/null +++ b/main_logistic.py @@ -0,0 +1,494 @@ +# ------------------------------------------------------------------------ +# SiameseIM +# Copyright (c) SenseTime. All Rights Reserved. +# ------------------------------------------------------------------------ +# Modified from MSN (https://github.com/facebookresearch/msn) +# Copyright (c) Facebook, Inc. and affiliates. All Rights Reserved. +# ------------------------------------------------------------------------ + + +import os +import argparse +import logging +import pprint + +import numpy as np +import torch +import torchvision.transforms as transforms +import cyanure as cyan + + +logging.basicConfig() +logger = logging.getLogger() +logger.setLevel(logging.INFO) + +parser = argparse.ArgumentParser() +parser.add_argument( + '--lambd', type=float, + default=0.00025, + help='regularization') +parser.add_argument( + '--penalty', type=str, + help='regularization for logistic classifier', + default='l2', + choices=[ + 'l2', + 'elastic-net' + ]) +parser.add_argument( + '--mask', type=float, + default=0.0, + help='regularization') +parser.add_argument( + '--preload', action='store_true', + help='whether to preload embs if possible') +parser.add_argument( + '--fname', type=str, + help='model architecture') +parser.add_argument( + '--model-name', type=str, + help='model architecture') +parser.add_argument( + '--pretrained', type=str, + help='path to pretrained model', + default='') +parser.add_argument( + '--device', type=str, + default='cuda:0', + help='device to run script on') +parser.add_argument( + '--normalize', type=bool, + default=True, + help='whether to standardize images before feeding to nework') +parser.add_argument( + '--root-path', type=str, + default='/datasets/', + help='root directory to data') +parser.add_argument( + '--image-folder', type=str, + default='imagenet_full_size/061417/', + help='image directory inside root_path') +parser.add_argument( + '--subset-path', type=str, + default=None, + help='name of dataset to evaluate on') +parser.add_argument('--local_rank', default=-1, type=int) + +logging.basicConfig() +logger = logging.getLogger() +logger.setLevel(logging.INFO) + +_GLOBAL_SEED = 0 +np.random.seed(_GLOBAL_SEED) +torch.manual_seed(_GLOBAL_SEED) +torch.backends.cudnn.benchmark = True + +pp = pprint.PrettyPrinter(indent=4) + + +def main( + blocks, + lambd, + mask_frac, + preload, + pretrained, + fname, + subset_path, + root_path, + image_folder, + penalty='l2', + model_name=None, + normalize=True, + device_str='cuda:0', + args=None +): + init_distributed_mode(args) + # torch.cuda.set_device(args.rank) + # device = torch.device('cuda') + # device = torch.device(device_str) + # if 'cuda' in device_str: + # torch.cuda.set_device(device) + + # -- Define file names used to save computed embeddings (for efficient + # -- reuse if running the script more than once) + subset_tag = '-'.join(subset_path.split('/')).split('.txt')[0] if subset_path is not None else 'imagenet_subses1-100percent' + train_embs_path = f'train-features-{subset_tag}-{fname}' + test_embs_path = f'val-features-{fname}' + logger.info(train_embs_path) + logger.info(test_embs_path) + + # pretrained = os.path.join(pretrained, fname) + + # -- Function to make train/test dataloader + def init_pipe(training): + # -- make data transforms + transform = transforms.Compose([ + transforms.Resize(size=256), + transforms.CenterCrop(size=224), + transforms.ToTensor(), + transforms.Normalize( + (0.485, 0.456, 0.406), + (0.229, 0.224, 0.225))]) + # -- init data-loaders/samplers + subset_file = subset_path if training else None + data_loader, _ = init_data( + transform=transform, + batch_size=64, + num_workers=0, + world_size=args.world_size, + rank=args.rank, + root_path=root_path, + image_folder=image_folder, + training=training, + copy_data=False, + drop_last=False, + subset_file=subset_file) + return data_loader + + # -- Initialize the model + encoder = init_model( + # device=device, + pretrained=pretrained, + model_name=model_name) + encoder.eval() + + # -- If train embeddings already computed, load file, otherwise, compute + # -- embeddings and save + if preload and os.path.exists(train_embs_path): + checkpoint = torch.load(train_embs_path, map_location='cpu') + embs, labs = checkpoint['embs'], checkpoint['labs'] + logger.info(f'loaded embs of shape {embs.shape}') + else: + data_loader = init_pipe(True) + embs, labs = make_embeddings( + blocks=blocks, + # device=device, + mask_frac=mask_frac, + data_loader=data_loader, + encoder=encoder) + torch.save({ + 'embs': embs, + 'labs': labs + }, train_embs_path) + logger.info(f'saved train embs of shape {embs.shape}') + # # -- Normalize embeddings + cyan.preprocess(embs, normalize=normalize, columns=False, centering=True) + + # import pdb; pdb.set_trace() + + # -- Fit Logistic Regression Classifier + classifier = cyan.MultiClassifier(loss='multiclass-logistic', penalty=penalty, fit_intercept=False) + lambd /= len(embs) + classifier.fit( + embs.numpy(), + labs.numpy(), + it0=10, + lambd=lambd, + lambd2=lambd, + nthreads=-1, + tol=1e-3, + solver='auto', + seed=0, + max_epochs=300) + + # -- Evaluate and log + train_score = classifier.score(embs.numpy(), labs.numpy()) + # -- (save train score) + logger.info(f'train score: {train_score}') + + # -- If test embeddings already computed, load file, otherwise, compute + # -- embeddings and save + if preload and os.path.exists(test_embs_path): + checkpoint = torch.load(test_embs_path, map_location='cpu') + test_embs, test_labs = checkpoint['embs'], checkpoint['labs'] + logger.info(f'loaded test embs of shape {test_embs.shape}') + else: + data_loader = init_pipe(False) + test_embs, test_labs = make_embeddings( + blocks=blocks, + # device=device, + mask_frac=0.0, + data_loader=data_loader, + encoder=encoder) + torch.save({ + 'embs': test_embs, + 'labs': test_labs + }, test_embs_path) + logger.info(f'saved test embs of shape {test_embs.shape}') + # -- Normalize embeddings + cyan.preprocess(test_embs, normalize=normalize, columns=False, centering=True) + + # -- Evaluate and log + test_score = classifier.score(test_embs.numpy(), test_labs.numpy()) + # -- (save test score) + logger.info(f'test score: {test_score}\n\n') + + return test_score + + +def init_distributed_mode(args): + if 'RANK' in os.environ and 'WORLD_SIZE' in os.environ: + args.rank = int(os.environ["RANK"]) + args.world_size = int(os.environ['WORLD_SIZE']) + args.gpu = int(os.environ['LOCAL_RANK']) + elif 'SLURM_PROCID' in os.environ: + args.rank = int(os.environ['SLURM_PROCID']) + args.world_size = int(os.environ['SLURM_NTASKS']) + node_list = os.environ['SLURM_NODELIST'] + num_gpus = torch.cuda.device_count() + args.gpu = args.rank % torch.cuda.device_count() + torch.cuda.set_device(args.rank % num_gpus) + import subprocess + addr = subprocess.getoutput( + f'scontrol show hostname {node_list} | head -n1') + # specify master port + if hasattr(args, 'port'): + os.environ['MASTER_PORT'] = str(args.port) + elif 'MASTER_PORT' in os.environ: + pass # use MASTER_PORT in the environment variable + else: + # 29500 is torch.distributed default port + os.environ['MASTER_PORT'] = '29502' + # use MASTER_ADDR in the environment variable if it already exists + if 'MASTER_ADDR' not in os.environ: + os.environ['MASTER_ADDR'] = addr + os.environ['WORLD_SIZE'] = str(args.world_size) + os.environ['LOCAL_RANK'] = str(args.rank % num_gpus) + os.environ['RANK'] = str(args.rank) + # dist.init_process_group(backend='nccl') + else: + print('Not using distributed mode') + setup_for_distributed(is_master=True) # hack + args.distributed = False + return + + args.distributed = True + + torch.cuda.set_device(args.gpu) + args.dist_backend = 'nccl' + args.dist_url = 'env://' + print('| distributed init (rank {}): {}, gpu {}'.format( + args.rank, args.dist_url, args.gpu), flush=True) + torch.distributed.init_process_group(backend=args.dist_backend, init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + torch.distributed.barrier() + # setup_for_distributed(args.rank == 0) + + +def init_data( + transform, + batch_size, + pin_mem=True, + num_workers=8, + world_size=1, + rank=0, + root_path=None, + image_folder=None, + training=True, + copy_data=False, + drop_last=True, + subset_file=None +): + + # dataset = ImageNet( + # root=root_path, + # image_folder=image_folder, + # transform=transform, + # train=training, + # copy_data=copy_data) + # if subset_file is not None: + # dataset = ImageNetSubset(dataset, subset_file) + import torchvision + if training: + dataset = torchvision.datasets.ImageFolder(os.path.join(root_path, 'train'), transform=transform) + with open(subset_file) as subset_file: + list_imgs = [li.split('\n')[0] for li in subset_file.readlines()] + dataset.samples = [( + os.path.join(os.path.join(root_path, 'train'), li.split('_')[0], li), + dataset.class_to_idx[li.split('_')[0]] + ) for li in list_imgs] + else: + dataset = torchvision.datasets.ImageFolder(os.path.join(root_path, 'val'), transform=transform) + + logger.info('ImageNet dataset created') + dist_sampler = torch.utils.data.distributed.DistributedSampler( + dataset=dataset, + num_replicas=world_size, + rank=rank) + data_loader = torch.utils.data.DataLoader( + dataset, + sampler=dist_sampler, + batch_size=batch_size, + drop_last=drop_last, + pin_memory=pin_mem, + num_workers=num_workers) + logger.info('ImageNet unsupervised data loader created') + + return (data_loader, dist_sampler) + + +def make_embeddings( + blocks, + # device, + mask_frac, + data_loader, + encoder, + epochs=1 +): + ipe = len(data_loader) + + z_mem, l_mem = [], [] + + for _ in range(epochs): + for itr, (imgs, labels) in enumerate(data_loader): + imgs = imgs.cuda() + with torch.no_grad(): + z = encoder.forward_features(imgs)[:, 0].cpu() + labels = labels.cpu() + z_mem.append(z) + l_mem.append(labels) + if itr % 50 == 0: + logger.info(f'[{itr}/{ipe}]') + + z_mem = torch.cat(z_mem, 0) + l_mem = torch.cat(l_mem, 0) + z_mem = all_gather(z_mem) + z_mem = torch.cat(z_mem, 0) + l_mem = all_gather(l_mem) + l_mem = torch.cat(l_mem, 0) + logger.info(z_mem.shape) + logger.info(l_mem.shape) + + return z_mem, l_mem + + +def all_gather(data): + """ + Run all_gather on arbitrary picklable data (not necessarily tensors) + Args: + data: any picklable object + Returns: + list[data]: list of data gathered from each rank + """ + world_size = torch.distributed.get_world_size() + if world_size == 1: + return [data] + + # serialized to a Tensor + import pickle + buffer = pickle.dumps(data) + storage = torch.ByteStorage.from_buffer(buffer) + tensor = torch.ByteTensor(storage).to("cuda") + + # obtain Tensor size of each rank + local_size = torch.LongTensor([tensor.numel()]).to("cuda") + size_list = [torch.LongTensor([0]).to("cuda") for _ in range(world_size)] + torch.distributed.all_gather(size_list, local_size) + size_list = [int(size.item()) for size in size_list] + max_size = max(size_list) + + # receiving Tensor from all ranks + # we pad the tensor because torch all_gather does not support + # gathering tensors of different shapes + tensor_list = [] + for _ in size_list: + tensor_list.append(torch.ByteTensor(size=(max_size,)).to("cuda")) + if local_size != max_size: + padding = torch.ByteTensor(size=(max_size - local_size,)).to("cuda") + tensor = torch.cat((tensor, padding), dim=0) + torch.distributed.all_gather(tensor_list, tensor) + + data_list = [] + for size, tensor in zip(size_list, tensor_list): + buffer = tensor.cpu().numpy().tobytes()[:size] + data_list.append(pickle.loads(buffer)) + + return data_list + + +def load_pretrained( + encoder, + pretrained +): + checkpoint = torch.load(pretrained, map_location='cpu') + pretrained_dict = {k.replace('module.', ''): v for k, v in checkpoint['target_encoder'].items()} + for k, v in encoder.state_dict().items(): + if k not in pretrained_dict: + logger.info(f'key "{k}" could not be found in loaded state dict') + elif pretrained_dict[k].shape != v.shape: + logger.info(f'key "{k}" is of different shape in model and loaded state dict') + pretrained_dict[k] = v + msg = encoder.load_state_dict(pretrained_dict, strict=False) + print(encoder) + logger.info(f'loaded pretrained model with msg: {msg}') + try: + logger.info(f'loaded pretrained encoder from epoch: {checkpoint["epoch"]} ' + f'path: {pretrained}') + except Exception: + pass + del checkpoint + return encoder + + +def init_model( + # device, + pretrained, + model_name, +): + # encoder = deit.__dict__[model_name]() + # encoder.fc = None + # encoder.to(device) + # encoder = load_pretrained(encoder=encoder, pretrained=pretrained) + + import models_vit + model = models_vit.__dict__[model_name]( + num_classes=1000, + global_pool=True, + init_values=None, + drop_path_rate=0.0 + ) + + checkpoint = torch.load(pretrained, map_location='cpu') + + print("Load pre-trained checkpoint from: %s" % pretrained) + checkpoint_model = checkpoint['model'] + state_dict = model.state_dict() + for k in ['head.weight', 'head.bias']: + if k in checkpoint_model and checkpoint_model[k].shape != state_dict[k].shape: + print(f"Removing key {k} from pretrained checkpoint") + del checkpoint_model[k] + + # load pre-trained model + msg = model.load_state_dict(checkpoint_model, strict=False) + print(msg) + + assert set(msg.missing_keys) == {'head.weight', 'head.bias', 'fc_norm.weight', 'fc_norm.bias'} + + model.head = None + + model.cuda() + + return model + + +if __name__ == '__main__': + """'main' for launching script using params read from command line""" + global args + args = parser.parse_args() + pp.pprint(args) + main( + blocks=1, + lambd=args.lambd, + penalty=args.penalty, + mask_frac=args.mask, + preload=args.preload, + pretrained=args.pretrained, + fname=args.fname, + subset_path=args.subset_path, + root_path=args.root_path, + image_folder=args.image_folder, + model_name=args.model_name, + normalize=args.normalize, + device_str=args.device, + args=args + ) diff --git a/main_pretrain.py b/main_pretrain.py new file mode 100644 index 0000000..71dd7cf --- /dev/null +++ b/main_pretrain.py @@ -0,0 +1,358 @@ +# ------------------------------------------------------------------------ +# SiameseIM +# Copyright (c) SenseTime. All Rights Reserved. +# ------------------------------------------------------------------------ +# Modified from MAE (https://github.com/facebookresearch/mae) +# Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved. +# ------------------------------------------------------------------------ +# References: +# timm: https://github.com/rwightman/pytorch-image-models/tree/master/timm +# DeiT: https://github.com/facebookresearch/deit +# ------------------------------------------------------------------------ + +import argparse +import datetime +import json +import numpy as np +import os +import time +from pathlib import Path + +import torch +import torch.distributed as dist +import torch.backends.cudnn as cudnn +from torch.utils.tensorboard import SummaryWriter +import torchvision.transforms as transforms +import torchvision.datasets as datasets + +import timm +assert timm.__version__ == "0.6.12" # version check +from timm.optim.optim_factory import param_groups_weight_decay +from timm.optim import create_optimizer + +import util.misc as misc +from util.misc import NativeScalerWithGradNormCount as NativeScaler +from util.augmentation import RandomResizedCrop, GaussianBlur, SingleRandomResizedCrop, RandomHorizontalFlip, Solarize +from util.datasets import ImagenetWithMask +import models_sim +from engine_pretrain import train_one_epoch + + +def get_args_parser(): + parser = argparse.ArgumentParser('MAE pre-training', add_help=False) + parser.add_argument('--batch_size', default=64, type=int, + help='Batch size per GPU (effective batch size is batch_size * accum_iter * # gpus') + parser.add_argument('--epochs', default=400, type=int) + parser.add_argument('--accum_iter', default=1, type=int, + help='Accumulate gradient iterations (for increasing the effective batch size under memory constraints)') + + # Model parameters + parser.add_argument('--model', default='mae_vit_large_patch16', type=str, metavar='MODEL', + help='Name of model to train') + + parser.add_argument('--input_size', default=224, type=int, + help='images input size') + + parser.add_argument('--mask_ratio', default=0.75, type=float, + help='Masking ratio (percentage of removed patches).') + + parser.add_argument('--norm_pix_loss', action='store_true', + help='Use (per-patch) normalized pixels as targets for computing loss') + parser.set_defaults(norm_pix_loss=False) + + parser.add_argument('--use_abs_pos_emb', default=True, action='store_true') + parser.add_argument('--disable_abs_pos_emb', dest='use_abs_pos_emb', action='store_false') + parser.add_argument('--use_shared_rel_pos_bias', default=False, action='store_true') + + # Optimizer parameters + parser.add_argument('--weight_decay', type=float, default=0.05, + help='weight decay (default: 0.05)') + + parser.add_argument('--lr', type=float, default=None, metavar='LR', + help='learning rate (absolute lr)') + parser.add_argument('--blr', type=float, default=1e-3, metavar='LR', + help='base learning rate: absolute_lr = base_lr * total_batch_size / 256') + parser.add_argument('--min_lr', type=float, default=0., metavar='LR', + help='lower lr bound for cyclic schedulers that hit 0') + + parser.add_argument('--warmup_epochs', type=int, default=40, metavar='N', + help='epochs to warmup LR') + + # Dataset parameters + parser.add_argument('--data_path', default='/datasets01/imagenet_full_size/061417/', type=str, + help='dataset path') + + parser.add_argument('--output_dir', default='./output_dir', + help='path where to save, empty for no saving') + parser.add_argument('--log_dir', default='./output_dir', + help='path where to tensorboard log') + parser.add_argument('--device', default='cuda', + help='device to use for training / testing') + parser.add_argument('--seed', default=0, type=int) + parser.add_argument('--resume', default='', + help='resume from checkpoint') + + parser.add_argument('--start_epoch', default=0, type=int, metavar='N', + help='start epoch') + parser.add_argument('--num_workers', default=10, type=int) + parser.add_argument('--pin_mem', action='store_true', + help='Pin CPU memory in DataLoader for more efficient (sometimes) transfer to GPU.') + parser.add_argument('--no_pin_mem', action='store_false', dest='pin_mem') + # parser.set_defaults(pin_mem=True) + + # distributed training parameters + parser.add_argument('--world_size', default=1, type=int, + help='number of distributed processes') + parser.add_argument('--local_rank', default=-1, type=int) + parser.add_argument('--dist_on_itp', action='store_true') + parser.add_argument('--dist_url', default='env://', + help='url used to set up distributed training') + + # SiameseIM parameters + # data + parser.add_argument('--crop_min', default=0.2, type=float) + parser.add_argument('--use_tcs_dataset', default=False, action='store_true') + + # model + parser.add_argument('--decoder_embed_dim', default=512, type=int) + parser.add_argument('--drop_path_rate', default=0.0, type=float) + parser.add_argument('--init_values', default=None, type=float) + parser.add_argument('--projector_depth', default=2, type=int) + parser.add_argument('--predictor_depth', default=4, type=int) + parser.add_argument('--use_proj_ln', default=False, action='store_true') + parser.add_argument('--use_pred_ln', default=False, action='store_true') + parser.add_argument('--train_patch_embed', default=False, action='store_true') + parser.add_argument('--online_ln', default=False, action='store_true', help='also use frozen LN in online branch') + + parser.add_argument('--loss_type', default='mae') + parser.add_argument('--neg_weight', default=0.02, type=float) + + parser.add_argument('--with_blockwise_mask', default=False, action='store_true') + parser.add_argument('--blockwise_num_masking_patches', default=75, type=int) + + # hyper-parameter + parser.add_argument('--mm', default=0.996, type=float) + parser.add_argument('--mmschedule', default='const') + parser.add_argument('--lambda_F', default=50, type=float) # may no need + parser.add_argument('--T', default=0.2, type=float) # check + parser.add_argument('--clip_grad', default=None, type=float) + parser.add_argument('--beta2', default=0.95, type=float) + + # misc + parser.add_argument('--auto_resume', default=True) + parser.add_argument('--save_freq', default=50, type=int) + parser.add_argument('--save_latest_freq', default=1, type=int) + parser.add_argument('--fp32', default=False, action='store_true') + parser.add_argument('--amp_growth_interval', default=2000, type=int) + + return parser + + +class DataAugmentationForSIM(object): + def __init__(self, args): + self.args = args + + self.random_resized_crop = SingleRandomResizedCrop(args.input_size, scale=(args.crop_min, 1.0), interpolation=3) + self.random_flip = RandomHorizontalFlip() + + self.color_transform1 = transforms.Compose([ + transforms.RandomApply([ + transforms.ColorJitter(0.4, 0.4, 0.2, 0.1) # not strengthened + ], p=0.8), + transforms.RandomGrayscale(p=0.2), + transforms.RandomApply([GaussianBlur([.1, 2.])], p=1.0), + ]) + + self.color_transform2 = transforms.Compose([ + transforms.RandomApply([ + transforms.ColorJitter(0.4, 0.4, 0.2, 0.1) # not strengthened + ], p=0.8), + transforms.RandomGrayscale(p=0.2), + transforms.RandomApply([GaussianBlur([.1, 2.])], p=0.1), + transforms.RandomApply([Solarize()], p=0.2), + ]) + + self.format_transform = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize( + mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) + ]) + + def __call__(self, image): + spatial_image1, flip1 = self.random_flip(image) + spatial_image2, flip2 = self.random_flip(image) + spatial_image1, i1, j1, h1, w1, W = self.random_resized_crop(spatial_image1) + spatial_image2, i2, j2, h2, w2, W = self.random_resized_crop(spatial_image2) + color_image1 = self.color_transform1(spatial_image1) + color_image2 = self.color_transform2(spatial_image2) + + relative_flip = (flip1 and not flip2) or (flip2 and not flip1) + return self.format_transform(color_image1), self.format_transform(color_image2), \ + (i2-i1)/h1, (j2-j1)/w1, h2/h1, w2/w1, relative_flip, (W-j1-j2)/w1 + + def __repr__(self): + repr = "(DataAugmentation,\n" + repr += " transform = %s,\n" % str(self.random_resized_crop) + str(self.random_flip) + str(self.color_transform1) + str(self.format_transform) + repr += ")" + return repr + + +def main(args): + misc.init_distributed_mode(args) # need change to torch.engine + + print('job dir: {}'.format(os.path.dirname(os.path.realpath(__file__)))) + print("{}".format(args).replace(', ', ',\n')) + + device = torch.device(args.device) + + # fix the seed for reproducibility + seed = args.seed + misc.get_rank() + torch.manual_seed(seed) + np.random.seed(seed) + + cudnn.benchmark = True + + # disable tf32 + torch.backends.cuda.matmul.allow_tf32 = False + torch.backends.cudnn.allow_tf32 = False + + # build augmentation and dataset + if args.loss_type in ['sim']: + transform_train = DataAugmentationForSIM(args) + else: + transform_train = transforms.Compose([ + transforms.RandomResizedCrop(args.input_size, scale=(0.2, 1.0), interpolation=3), # 3 is bicubic + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])]) + if not args.use_tcs_dataset: + dataset_train = datasets.ImageFolder(os.path.join(args.data_path, 'train'), transform=transform_train) + dataset_train = ImagenetWithMask(os.path.join(args.data_path, 'train'), + transform=transform_train, + with_blockwise_mask=args.with_blockwise_mask, + blockwise_num_masking_patches=args.blockwise_num_masking_patches) + else: # for internal use only + from util.tcs_datasets import ImagenetTCSDataset + dataset_train = ImagenetTCSDataset('train', + 's3://imagenet', + use_tcs=True, + transform=transform_train, + with_blockwise_mask=args.with_blockwise_mask, + blockwise_num_masking_patches=args.blockwise_num_masking_patches, + local_rank=int(os.environ['LOCAL_RANK']), + local_size=int(os.environ['LOCAL_SIZE']), + tcs_conf_path='./petreloss.conf') + print(dataset_train) + + # build dataloader + if True: # args.distributed: + num_tasks = misc.get_world_size() + global_rank = misc.get_rank() + sampler_train = torch.utils.data.DistributedSampler( + dataset_train, num_replicas=num_tasks, rank=global_rank, shuffle=True + ) + print("Sampler_train = %s" % str(sampler_train)) + else: + sampler_train = torch.utils.data.RandomSampler(dataset_train) + + if global_rank == 0 and args.log_dir is not None: + os.makedirs(args.log_dir, exist_ok=True) + log_writer = SummaryWriter(log_dir=args.log_dir) + else: + log_writer = None + + data_loader_train = torch.utils.data.DataLoader( + dataset_train, sampler=sampler_train, + batch_size=args.batch_size, + num_workers=args.num_workers, + pin_memory=args.pin_mem, + drop_last=True, + ) + + + # build model + model = models_sim.__dict__[args.model](norm_pix_loss=args.norm_pix_loss, args=args) + model.to(device) + model_without_ddp = model + + eff_batch_size = args.batch_size * args.accum_iter * misc.get_world_size() + if args.lr is None: # only base_lr is specified + args.lr = args.blr * eff_batch_size / 256 + + print("base lr: %.2e" % (args.lr * 256 / eff_batch_size)) + print("actual lr: %.2e" % args.lr) + + print("accumulate grad iterations: %d" % args.accum_iter) + print("effective batch size: %d" % eff_batch_size) + + if args.distributed: + model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model) + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu], find_unused_parameters=True) + model_without_ddp = model.module + print("Model = %s" % str(model_without_ddp)) + + # build optimizer + # following timm: set wd as 0 for bias and norm layers + param_groups = param_groups_weight_decay(model_without_ddp, args.weight_decay) + optimizer = torch.optim.AdamW(param_groups, lr=args.lr, betas=(0.9, args.beta2)) + print(optimizer) + loss_scaler = NativeScaler(enabled=(not args.fp32), growth_interval=args.amp_growth_interval) + + misc.auto_load_model(args=args, model_without_ddp=model_without_ddp, optimizer=optimizer, + loss_scaler=loss_scaler) + + # start training + print(f"Start training for {args.epochs} epochs") + start_time = time.time() + for epoch in range(args.start_epoch, args.epochs): + epoch_start_time = time.time() + if args.distributed: + data_loader_train.sampler.set_epoch(epoch) + train_stats = train_one_epoch( + model, data_loader_train, + optimizer, device, epoch, loss_scaler, + log_writer=log_writer, + args=args + ) + dist.barrier() + + # save ckpt + if args.output_dir and ((epoch+1) % args.save_freq == 0 or epoch + 1 == args.epochs): + misc.save_model( + args=args, model=model, model_without_ddp=model_without_ddp, optimizer=optimizer, + loss_scaler=loss_scaler, epoch=epoch) + if (epoch+1) % args.save_latest_freq == 0: + misc.save_model( + args=args, model=model, model_without_ddp=model_without_ddp, optimizer=optimizer, + loss_scaler=loss_scaler, epoch=epoch, latest=True) + + # log information + log_stats = {**{f'train_{k}': v for k, v in train_stats.items()}, + 'epoch': epoch,} + + if args.output_dir and misc.is_main_process(): + if log_writer is not None: + log_writer.flush() + with open(os.path.join(args.output_dir, "log.txt"), mode="a", encoding="utf-8") as f: + f.write(json.dumps(log_stats) + "\n") + if misc.is_main_process(): + epoch_total_time = time.time() - epoch_start_time + now = datetime.datetime.today() + eta = now + datetime.timedelta(seconds=(args.epochs-epoch-1)*int(epoch_total_time)) + next_50_ep = ((epoch + 1) // 50 + 1) * 50 + eta_to_next_50 =now + datetime.timedelta(seconds=(next_50_ep - epoch - 1) * int(epoch_total_time)) + print(f"ETA to {args.epochs:4d}ep:\t{str(eta)}") + print(f"ETA to {next_50_ep:4d}ep:\t{str(eta_to_next_50)}") + dist.barrier() + + total_time = time.time() - start_time + total_time_str = str(datetime.timedelta(seconds=int(total_time))) + print('Training time {}'.format(total_time_str)) + + +if __name__ == '__main__': + args = get_args_parser() + args = args.parse_args() + if args.output_dir: + Path(args.output_dir).mkdir(parents=True, exist_ok=True) + main(args) diff --git a/models_sim.py b/models_sim.py new file mode 100644 index 0000000..1f589aa --- /dev/null +++ b/models_sim.py @@ -0,0 +1,515 @@ +# ------------------------------------------------------------------------ +# SiameseIM +# Copyright (c) SenseTime. All Rights Reserved. +# ------------------------------------------------------------------------ +# Modified from MAE (https://github.com/facebookresearch/mae) +# Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved. +# ------------------------------------------------------------------------ +# References: +# timm: https://github.com/rwightman/pytorch-image-models/tree/master/timm +# DeiT: https://github.com/facebookresearch/deit +# ------------------------------------------------------------------------ + + +import random +from functools import partial +from turtle import update +import math + +import torch +import torch.nn as nn + +from util.pos_embed import get_2d_sincos_pos_embed, get_2d_sincos_pos_embed_relative +from util.misc import LayerNorm +from models_vit import Block, CrossBlock, PatchEmbed + + +class PermuteBN(nn.Module): + def __init__(self, dim): + super().__init__() + self.bn = nn.BatchNorm1d(dim) + + @torch.cuda.amp.autocast(enabled=False) + def forward(self, x): + x = x.permute(0, 2, 1) # N, L, C -> N, C, L + x = x.float() + x = self.bn(x) + x = x.permute(0, 2, 1) # N, C, L -> N, L, C + + return x + + +class SiameseIMViT(nn.Module): + """ SiameseIM with VisionTransformer backbone + """ + def __init__(self, img_size=224, patch_size=16, in_chans=3, + embed_dim=1024, depth=24, num_heads=16, + decoder_embed_dim=512, decoder_depth=8, decoder_num_heads=16, + mlp_ratio=4., norm_layer=LayerNorm, norm_pix_loss=False, args=None): + super().__init__() + self.norm_pix_loss = norm_pix_loss + self.args = args + decoder_embed_dim = args.decoder_embed_dim + + # -------------------------------------------------------------------------- + # encoder specifics + self.patch_embed = PatchEmbed(img_size, patch_size, in_chans, embed_dim) + num_patches = self.patch_embed.num_patches + self.num_patches = num_patches + + self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dim)) + if args.use_abs_pos_emb: + if hasattr(self, 'cls_token'): + self.pos_embed = nn.Parameter(torch.zeros(1, num_patches+1, embed_dim), requires_grad=False) # fixed sin-cos embedding + else: + self.pos_embed = nn.Parameter(torch.zeros(1, num_patches, embed_dim), requires_grad=False) # fixed sin-cos embedding + + dpr = [x.item() for x in torch.linspace(0, args.drop_path_rate, depth)] + self.blocks = nn.ModuleList([ + Block(embed_dim, num_heads, mlp_ratio, qkv_bias=True, norm_layer=norm_layer, + drop_path=dpr[i], init_values=args.init_values) + for i in range(depth)]) + # -------------------------------------------------------------------------- + + # -------------------------------------------------------------------------- + # decoder specifics + if args.loss_type in ['mae']: + self.decoder_embed = nn.Linear(embed_dim, decoder_embed_dim, bias=True) + + self.mask_token = nn.Parameter(torch.zeros(1, 1, decoder_embed_dim)) + + if hasattr(self, 'cls_token'): + self.decoder_pos_embed = nn.Parameter(torch.zeros(1, num_patches+1, decoder_embed_dim), requires_grad=False) # fixed sin-cos embedding + else: + self.decoder_pos_embed = nn.Parameter(torch.zeros(1, num_patches, decoder_embed_dim), requires_grad=False) + + self.decoder_blocks = nn.ModuleList([ + Block(decoder_embed_dim, decoder_num_heads, mlp_ratio, qkv_bias=True, norm_layer=norm_layer) + for i in range(decoder_depth)]) + + self.decoder_norm = norm_layer(decoder_embed_dim) + self.decoder_pred = nn.Linear(decoder_embed_dim, patch_size**2 * in_chans, bias=True) # decoder to patch + elif args.loss_type in ['sim',]: + self.decoder_embed = nn.Linear(embed_dim, decoder_embed_dim, bias=True) + + self.mask_token = nn.Parameter(torch.zeros(1, 1, decoder_embed_dim)) + + if hasattr(self, 'cls_token'): + self.decoder_pos_embed = nn.Parameter(torch.zeros(1, num_patches+1, decoder_embed_dim), requires_grad=False) # fixed sin-cos embedding + else: + self.decoder_pos_embed = nn.Parameter(torch.zeros(1, num_patches, decoder_embed_dim), requires_grad=False) + + if args.projector_depth > 0: + self.projector_decoder_blocks = nn.ModuleList([ + Block(decoder_embed_dim, decoder_num_heads, mlp_ratio, qkv_bias=True, + norm_layer=norm_layer if args.use_proj_ln else PermuteBN) + for i in range(args.projector_depth)]) + + self.predictor_decoder_blocks = nn.ModuleList([ + Block(decoder_embed_dim, decoder_num_heads, mlp_ratio, qkv_bias=True, + norm_layer=norm_layer if args.use_pred_ln else PermuteBN) + for i in range(args.predictor_depth)]) + + self.decoder_pred = nn.Linear(decoder_embed_dim, decoder_embed_dim, bias=True) # decoder to patch + if args.online_ln: + self.student_norm = LayerNorm(decoder_embed_dim) + for p in self.student_norm.parameters(): + p.requires_grad = False + else: + self.student_norm = nn.Identity() + # -------------------------------------------------------------------------- + + # --------------------------------------------------------------------------- + # decoder pos embed change dim + if self.args.loss_type in ['sim',]: + self.decoder_pos_mlp = nn.Linear(decoder_embed_dim*2, decoder_embed_dim) + # --------------------------------------------------------------------------- + + self.initialize_weights() + + # build momentum branch + if self.args.loss_type in ['sim',]: + self.build_momentum_target(img_size, patch_size, in_chans, embed_dim, num_heads, + mlp_ratio, norm_layer, depth, decoder_embed_dim, decoder_num_heads) + + # stop grad for patch embedding + if (not args.train_patch_embed): + self.patch_embed.proj.weight.requires_grad = False + self.patch_embed.proj.bias.requires_grad = False + + def build_momentum_target(self, img_size, patch_size, in_chans, embed_dim, num_heads, + mlp_ratio, norm_layer, depth, decoder_embed_dim, decoder_num_heads): + # -------------------------------------------------------------------------- + # momentum encoder specifics + self.mm_patch_embed = PatchEmbed(img_size, patch_size, in_chans, embed_dim) + + if hasattr(self, 'cls_token'): + self.mm_cls_token = nn.Parameter(torch.zeros(1, 1, embed_dim)) + + self.mm_blocks = nn.ModuleList([ + Block(embed_dim, num_heads, mlp_ratio, qkv_bias=True, norm_layer=norm_layer, init_values=self.args.init_values) + for i in range(depth)]) + + # load weight + self.mm_patch_embed.load_state_dict(self.patch_embed.state_dict()) + for p in self.mm_patch_embed.parameters(): + p.requires_grad = False + + self.mm_cls_token.data.copy_(self.cls_token.data) + self.mm_cls_token.requires_grad = False + + self.mm_blocks.load_state_dict(self.blocks.state_dict()) + for p in self.mm_blocks.parameters(): + p.requires_grad = False + # -------------------------------------------------------------------------- + + # -------------------------------------------------------------------------- + # momentum decoder specifics + self.mm_decoder_embed = nn.Linear(embed_dim, decoder_embed_dim, bias=True) + + self.mm_mask_token = nn.Parameter(torch.zeros(1, 1, decoder_embed_dim)) + + if self.args.projector_depth > 0: + self.mm_projector_decoder_blocks = nn.ModuleList([ + Block(decoder_embed_dim, decoder_num_heads, mlp_ratio, qkv_bias=True, norm_layer=norm_layer if self.args.use_proj_ln else PermuteBN) + for i in range(self.args.projector_depth)]) + + # load weight + self.mm_decoder_embed.load_state_dict(self.decoder_embed.state_dict()) + for p in self.mm_decoder_embed.parameters(): + p.requires_grad = False + + self.mm_mask_token.data.copy_(self.mask_token.data) + self.mm_mask_token.requires_grad = False + + if self.args.projector_depth > 0: + self.mm_projector_decoder_blocks.load_state_dict(self.projector_decoder_blocks.state_dict()) + for p in self.mm_projector_decoder_blocks.parameters(): + p.requires_grad = False + # --------------------------------------------------------------------------- + + if self.args.loss_type in ['sim',]: + self.teacher_norm = LayerNorm(decoder_embed_dim, elementwise_affine=False) + for p in self.teacher_norm.parameters(): + p.requires_grad = False + + def initialize_weights(self): + # initialization + # initialize (and freeze) pos_embed by sin-cos embedding + if self.args.use_abs_pos_emb: + pos_embed = get_2d_sincos_pos_embed(self.pos_embed.shape[-1], int(self.num_patches**.5), cls_token=hasattr(self, 'cls_token')) + self.pos_embed.data.copy_(torch.from_numpy(pos_embed).float().unsqueeze(0)) + + if hasattr(self, 'decoder_pos_embed'): + decoder_pos_embed = get_2d_sincos_pos_embed(self.decoder_pos_embed.shape[-1], int(self.num_patches**.5), cls_token=hasattr(self, 'cls_token')) + self.decoder_pos_embed.data.copy_(torch.from_numpy(decoder_pos_embed).float().unsqueeze(0)) + + # initialize patch_embed like nn.Linear (instead of nn.Conv2d) + w = self.patch_embed.proj.weight.data + torch.nn.init.xavier_uniform_(w.view([w.shape[0], -1])) + + # timm's trunc_normal_(std=.02) is effectively normal_(std=0.02) as cutoff is too big (2.) + if hasattr(self, 'cls_token'): + torch.nn.init.normal_(self.cls_token, std=.02) + if hasattr(self, 'mask_token'): + torch.nn.init.normal_(self.mask_token, std=.02) + + # initialize nn.Linear and LayerNorm + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + # we use xavier_uniform following official JAX ViT: + torch.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 patchify(self, imgs): + """ + imgs: (N, 3, H, W) + x: (N, L, patch_size**2 *3) + """ + p = self.patch_embed.patch_size[0] + assert imgs.shape[2] == imgs.shape[3] and imgs.shape[2] % p == 0 + + h = w = imgs.shape[2] // p + x = imgs.reshape(shape=(imgs.shape[0], 3, h, p, w, p)) + x = torch.einsum('nchpwq->nhwpqc', x) + x = x.reshape(shape=(imgs.shape[0], h * w, p**2 * 3)) + return x + + def unpatchify(self, x): + """ + x: (N, L, patch_size**2 *3) + imgs: (N, 3, H, W) + """ + p = self.patch_embed.patch_size[0] + h = w = int(x.shape[1]**.5) + assert h * w == x.shape[1] + + x = x.reshape(shape=(x.shape[0], h, w, p, p, 3)) + x = torch.einsum('nhwpqc->nchpwq', x) + imgs = x.reshape(shape=(x.shape[0], 3, h * p, h * p)) + return imgs + + def random_masking(self, x, mask_ratio): + """ + Perform per-sample random masking by per-sample shuffling. + Per-sample shuffling is done by argsort random noise. + x: [N, L, D], sequence + """ + N, L, D = x.shape # batch, length, dim + len_keep = int(L * (1 - mask_ratio)) + + noise = torch.rand(N, L, device=x.device) # noise in [0, 1] + + # sort noise for each sample + ids_shuffle = torch.argsort(noise, dim=1) # ascend: small is keep, large is remove + ids_restore = torch.argsort(ids_shuffle, dim=1) + + # keep the first subset + # ids_keep = ids_shuffle[:, :len_keep] + # x_masked = torch.gather(x, dim=1, index=ids_keep.unsqueeze(-1).repeat(1, 1, D)) + + # generate the binary mask: 0 is keep, 1 is remove + mask = torch.ones([N, L], device=x.device) + mask[:, :len_keep] = 0 + # unshuffle to get the binary mask + mask = torch.gather(mask, dim=1, index=ids_restore) + + return mask, ids_restore + + @torch.cuda.amp.autocast(enabled=False) + def mm_update(self, mm): + for param_q, param_k in zip(self.patch_embed.parameters(), self.mm_patch_embed.parameters()): + param_k.data = param_k.data * mm + param_q.data * (1. - mm) + for param_q, param_k in zip(self.blocks.parameters(), self.mm_blocks.parameters()): + param_k.data = param_k.data * mm + param_q.data * (1. - mm) + if hasattr(self, 'mm_cls_token'): + self.mm_cls_token.data = self.mm_cls_token.data * mm + self.cls_token.data * (1. - mm) + if hasattr(self, 'mm_norm'): + for param_q, param_k in zip(self.norm.parameters(), self.mm_norm.parameters()): + param_k.data = param_k.data * mm + param_q.data * (1. - mm) + if hasattr(self, 'mm_projector'): + for param_q, param_k in zip(self.projector.parameters(), self.mm_projector.parameters()): + param_k.data = param_k.data * mm + param_q.data * (1. - mm) + if hasattr(self, 'mm_decoder_embed'): + for param_q, param_k in zip(self.decoder_embed.parameters(), self.mm_decoder_embed.parameters()): + param_k.data = param_k.data * mm + param_q.data * (1. - mm) + if hasattr(self, 'mm_mask_token'): + self.mm_mask_token.data = self.mm_mask_token.data * mm + self.mask_token.data * (1. - mm) + if hasattr(self, 'mm_decoder_blocks'): + for param_q, param_k in zip(self.decoder_blocks.parameters(), self.mm_decoder_blocks.parameters()): + param_k.data = param_k.data * mm + param_q.data * (1. - mm) + if hasattr(self, 'mm_projector_decoder_blocks'): + for param_q, param_k in zip(self.projector_decoder_blocks.parameters(), self.mm_projector_decoder_blocks.parameters()): + param_k.data = param_k.data * mm + param_q.data * (1. - mm) + if hasattr(self, 'mm_decoder_norm'): + for param_q, param_k in zip(self.decoder_norm.parameters(), self.mm_decoder_norm.parameters()): + param_k.data = param_k.data * mm + param_q.data * (1. - mm) + if hasattr(self, 'mm_decoder_pred'): + for param_q, param_k in zip(self.decoder_pred.parameters(), self.mm_decoder_pred.parameters()): + param_k.data = param_k.data * mm + param_q.data * (1. - mm) + + def forward_encoder(self, x, mask_ratio): + # embed patches + x = self.patch_embed(x) + + # add pos embed w/o cls token + x = x + self.pos_embed + + # masking: length -> length * mask_ratio + mask, ids_restore = self.random_masking(x, mask_ratio) + x = x[~mask.bool()].view(x.shape[0], -1, x.shape[-1]) + + # apply Transformer blocks + for blk in self.blocks: + x = blk(x) + x = self.norm(x) + + return x, mask, ids_restore + + def forward_decoder(self, x, ids_restore): + # embed tokens + x = self.decoder_embed(x) + + # append mask tokens to sequence + mask_tokens = self.mask_token.repeat(x.shape[0], ids_restore.shape[1] + 1 - x.shape[1], 1) + x_ = torch.cat([x, mask_tokens], dim=1) # no cls token + x_ = torch.gather(x_, dim=1, index=ids_restore.unsqueeze(-1).repeat(1, 1, x.shape[2])) # unshuffle + x = x_ + + # add pos embed + x = x + self.decoder_pos_embed + + # apply Transformer blocks + for blk in self.decoder_blocks: + x = blk(x) + x = self.decoder_norm(x) + + # predictor projection + x = self.decoder_pred(x) + + return x + + def forward_loss(self, imgs, pred, mask): + """ + imgs: [N, 3, H, W] + pred: [N, L, p*p*3] + mask: [N, L], 0 is keep, 1 is remove, + """ + target = self.patchify(imgs) + if self.norm_pix_loss: + mean = target.mean(dim=-1, keepdim=True) + var = target.var(dim=-1, keepdim=True) + target = (target - mean) / (var + 1.e-6)**.5 + + loss = (pred - target) ** 2 + loss = loss.mean(dim=-1) # [N, L], mean loss per patch + + loss = (loss * mask).sum() / mask.sum() # mean loss on removed patches + return loss + + def forward_mae(self, imgs, mask_ratio=0.75): + latent, mask, ids_restore = self.forward_encoder(imgs, mask_ratio) + pred = self.forward_decoder(latent, ids_restore) # [N, L, p*p*3] + loss = self.forward_loss(imgs, pred, mask) + return loss, pred, mask + + def forward(self, *args, **kwargs): + if self.args.loss_type in ['sim',]: + return self.forward_sim(*args, **kwargs) + else: + return self.forward_mae(*args, **kwargs) + + def forward_sim(self, x1, x2, rel_pos_21, mm, update_mm, mask=None): + # forward online encoder + if self.args.with_blockwise_mask: + assert mask is not None, 'mask should not be None when mask_type is block' + mask = mask.view(mask.shape[0], -1) + else: + assert False + mask, ids_restore1 = self.random_masking(online_x1, self.args.mask_ratio) + + online_x1 = self.patch_embed(x1) + online_x1 = online_x1 + self.pos_embed[:, 1:, :] + online_x1 = online_x1[~mask.bool()].view(online_x1.shape[0], -1, online_x1.shape[-1]) + # add cls token + cls_tokens = self.cls_token.expand(online_x1.shape[0], -1, -1) + self.pos_embed[:, 0, :].unsqueeze(1) + online_x1 = torch.cat((cls_tokens, online_x1), dim=1) + + # forward online encoder + for blk in self.blocks: + online_x1 = blk(online_x1) + + # forward online projector + online_x1 = self.decoder_embed(online_x1) + if self.args.projector_depth > 0: + for blk in self.projector_decoder_blocks: + online_x1 = blk(online_x1) + + # calculate decoder pos embed + cls_pos_embed = self.decoder_pos_embed[:, 0, :].unsqueeze(1) + x1_vis_embed = self.decoder_pos_embed[:, 1:, :].repeat(online_x1.shape[0], 1, 1)[~mask.bool()].view(online_x1.shape[0], -1, self.decoder_pos_embed.shape[-1]) + x2_embed = get_2d_sincos_pos_embed_relative(*rel_pos_21, self.decoder_pos_embed.shape[-1], + int(self.num_patches ** .5)) + x2_embed = self.decoder_pos_mlp(x2_embed) + + # append mask tokens to sequence + cls_token = online_x1[:, 0, :].unsqueeze(1) + x1_vis_tokens = online_x1[:, 1:, :] + mask_tokens = self.mask_token.repeat(x2.shape[0], x2_embed.shape[1], 1) + x = torch.cat([cls_token+cls_pos_embed, x1_vis_tokens+x1_vis_embed, mask_tokens+x2_embed], dim=1) + + # forward online decoder + for blk in self.predictor_decoder_blocks: + x = blk(x) + + # predictor projection + x = self.decoder_pred(x) + pred = x[:, -x2_embed.shape[1]:] + + # forward target encoder + with torch.no_grad(): + if update_mm: + self.mm_update(mm) + + target_x2 = self.mm_patch_embed(x2) + mm_cls_tokens = self.mm_cls_token.expand(target_x2.shape[0], -1, -1) + target_x2 = torch.cat((mm_cls_tokens, target_x2), dim=1) + target_x2 = target_x2 + self.pos_embed + + # forward target encoder + for blk in self.mm_blocks: + target_x2 = blk(target_x2) + + # forward target projector + target_x2 = self.mm_decoder_embed(target_x2) + if self.args.projector_depth > 0: + for blk in self.mm_projector_decoder_blocks: + target_x2 = blk(target_x2) + + target = target_x2[:, 1:, :] + + # compute loss + outputs = {} + with torch.cuda.amp.autocast(enabled=False): + loss = self.compute_unigrad_loss(pred.float(), target.float()) + outputs['loss_sim'] = loss.item() + + return loss, outputs + + def compute_unigrad_loss(self, pred, target): + pred = self.student_norm(pred) + with torch.no_grad(): + target = self.teacher_norm(target) + + dense_pred = pred.reshape(-1, pred.shape[-1]) + dense_target = target.reshape(-1, target.shape[-1]) + + # compute pos term + pos_term = ((dense_pred - dense_target)**2).sum(-1).mean() + + # compute neg term + correlation = (dense_target.T @ dense_target) / dense_target.shape[0] + torch.distributed.all_reduce(correlation) + correlation = correlation / torch.distributed.get_world_size() + + neg_term = torch.diagonal(dense_pred @ correlation @ dense_pred.T).mean() + + loss = (pos_term + self.args.neg_weight * neg_term) / pred.shape[-1] + + return loss + + +def sim_vit_base_patch16_dec512d8b(**kwargs): + model = SiameseIMViT( + patch_size=16, embed_dim=768, depth=12, num_heads=12, + decoder_embed_dim=512, decoder_depth=8, decoder_num_heads=16, + mlp_ratio=4, norm_layer=partial(LayerNorm, eps=1e-6), **kwargs) + return model + + +def sim_vit_large_patch16_dec512d8b(**kwargs): + model = SiameseIMViT( + patch_size=16, embed_dim=1024, depth=24, num_heads=16, + decoder_embed_dim=512, decoder_depth=8, decoder_num_heads=16, + mlp_ratio=4, norm_layer=partial(LayerNorm, eps=1e-6), **kwargs) + return model + + +def sim_vit_huge_patch14_dec512d8b(**kwargs): + model = SiameseIMViT( + patch_size=14, embed_dim=1280, depth=32, num_heads=16, + decoder_embed_dim=512, decoder_depth=8, decoder_num_heads=16, + mlp_ratio=4, norm_layer=partial(LayerNorm, eps=1e-6), **kwargs) + return model + + +# set recommended archs +sim_vit_base_patch16 = sim_vit_base_patch16_dec512d8b # decoder: 512 dim, 8 blocks +sim_vit_large_patch16 = sim_vit_large_patch16_dec512d8b # decoder: 512 dim, 8 blocks +sim_vit_huge_patch14 = sim_vit_huge_patch14_dec512d8b # decoder: 512 dim, 8 blocks diff --git a/models_vit.py b/models_vit.py new file mode 100644 index 0000000..3cfbbe6 --- /dev/null +++ b/models_vit.py @@ -0,0 +1,266 @@ +# ------------------------------------------------------------------------ +# SiameseIM +# Copyright (c) SenseTime. All Rights Reserved. +# ------------------------------------------------------------------------ +# Modified from MAE (https://github.com/facebookresearch/mae) +# Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved. +# ------------------------------------------------------------------------ +# References: +# timm: https://github.com/rwightman/pytorch-image-models/tree/master/timm +# DeiT: https://github.com/facebookresearch/deit +# ------------------------------------------------------------------------ + +from functools import partial + +import torch +import torch.nn as nn +import torch.nn.functional as F + +import timm.models.vision_transformer +from timm.models.layers import Mlp, DropPath +from timm.models.layers.helpers import to_2tuple + +from util.misc import LayerNorm + + +class PatchEmbed(nn.Module): + """ 2D Image to Patch Embedding + """ + def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768, norm_layer=None, flatten=True): + super().__init__() + img_size = to_2tuple(img_size) + patch_size = to_2tuple(patch_size) + self.img_size = img_size + self.patch_size = patch_size + self.grid_size = (img_size[0] // patch_size[0], img_size[1] // patch_size[1]) + self.num_patches = self.grid_size[0] * self.grid_size[1] + self.flatten = flatten + + self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size) + self.norm = norm_layer(embed_dim) if norm_layer else nn.Identity() + + def forward(self, x): + B, C, H, W = x.shape + x = self.proj(x) + if self.flatten: + x = x.flatten(2).transpose(1, 2) # BCHW -> BNC + x = self.norm(x) + return x + + +class Attention(nn.Module): + def __init__(self, dim, num_heads=8, qkv_bias=False, attn_drop=0., proj_drop=0.): + super().__init__() + assert dim % num_heads == 0, 'dim should be divisible by num_heads' + self.num_heads = num_heads + head_dim = dim // num_heads + self.scale = 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.unbind(0) # make torchscript happy (cannot use tensor as tuple) + + attn = ((q * self.scale) @ k.transpose(-2, -1)) + attn = attn - attn.max(-1)[0].unsqueeze(-1) # in case of overflow for fp16 + 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 CrossAttention(nn.Module): + def __init__(self, dim, num_heads=8, qkv_bias=False, attn_drop=0., proj_drop=0.): + super().__init__() + assert dim % num_heads == 0, 'dim should be divisible by num_heads' + self.num_heads = num_heads + head_dim = dim // num_heads + self.scale = head_dim ** -0.5 + + # self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias) + self.q = nn.Linear(dim, dim, bias=qkv_bias) + self.kv = nn.Linear(dim, dim * 2, 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, query, key): + B, Nq, C = query.shape + _, Nk, _ = key.shape + q = self.q(query).reshape(B, Nq, self.num_heads, C // self.num_heads).permute(0, 2, 1, 3) + kv = self.kv(key).reshape(B, Nk, 2, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4) + k, v = kv.unbind(0) # make torchscript happy (cannot use tensor as tuple) + + attn = ((q * self.scale) @ k.transpose(-2, -1)) + attn = attn - attn.max(-1)[0].unsqueeze(-1) # in case of overflow for fp16 + attn = attn.softmax(dim=-1) + attn = self.attn_drop(attn) + + x = (attn @ v).transpose(1, 2).reshape(B, Nq, C) + x = self.proj(x) + x = self.proj_drop(x) + return x + + +class LayerScale(nn.Module): + def __init__(self, dim, init_values=1e-5, inplace=False): + super().__init__() + self.inplace = inplace + self.gamma = nn.Parameter(init_values * torch.ones(dim)) + + @torch.cuda.amp.autocast(enabled=False) + def forward(self, x): + return x.float().mul_(self.gamma.float()) if self.inplace else x.float() * self.gamma.float() + + +class Block(nn.Module): + + def __init__( + self, dim, num_heads, mlp_ratio=4., qkv_bias=False, drop=0., attn_drop=0., init_values=None, + drop_path=0., act_layer=nn.GELU, norm_layer=LayerNorm): + super().__init__() + self.norm1 = norm_layer(dim) + self.attn = Attention(dim, num_heads=num_heads, qkv_bias=qkv_bias, attn_drop=attn_drop, proj_drop=drop) + self.ls1 = LayerScale(dim, init_values=init_values) if init_values else nn.Identity() + # NOTE: drop path for stochastic depth, we shall see if this is better than dropout here + self.drop_path1 = 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.ls2 = LayerScale(dim, init_values=init_values) if init_values else nn.Identity() + self.drop_path2 = DropPath(drop_path) if drop_path > 0. else nn.Identity() + + def forward(self, x): + x = x + self.drop_path1(self.ls1(self.attn(self.norm1(x)))) + x = x + self.drop_path2(self.ls2(self.mlp(self.norm2(x)))) + + return x + + +class CrossBlock(nn.Module): + + def __init__( + self, dim, num_heads, mlp_ratio=4., qkv_bias=False, drop=0., attn_drop=0., init_values=None, + drop_path=0., act_layer=nn.GELU, norm_layer=LayerNorm): + super().__init__() + self.norm1 = norm_layer(dim) + self.norm2 = norm_layer(dim) + self.cross_attn = CrossAttention(dim, num_heads=num_heads, qkv_bias=qkv_bias, attn_drop=attn_drop, proj_drop=drop) + self.ls1 = LayerScale(dim, init_values=init_values) if init_values else nn.Identity() + # NOTE: drop path for stochastic depth, we shall see if this is better than dropout here + self.drop_path1 = DropPath(drop_path) if drop_path > 0. else nn.Identity() + + self.norm3 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp1 = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop) + self.ls2 = LayerScale(dim, init_values=init_values) if init_values else nn.Identity() + self.drop_path2 = DropPath(drop_path) if drop_path > 0. else nn.Identity() + + self.norm4 = norm_layer(dim) + self.attn = Attention(dim, num_heads=num_heads, qkv_bias=qkv_bias, attn_drop=attn_drop, proj_drop=drop) + self.ls3 = LayerScale(dim, init_values=init_values) if init_values else nn.Identity() + # NOTE: drop path for stochastic depth, we shall see if this is better than dropout here + self.drop_path3 = DropPath(drop_path) if drop_path > 0. else nn.Identity() + + self.norm5 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp2 = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop) + self.ls4 = LayerScale(dim, init_values=init_values) if init_values else nn.Identity() + self.drop_path4 = DropPath(drop_path) if drop_path > 0. else nn.Identity() + + + def forward(self, query, key): + query = query + self.drop_path1(self.ls1(self.cross_attn(self.norm1(query), self.norm2(key)))) + query = query + self.drop_path2(self.ls2(self.mlp1(self.norm3(query)))) + query = query + self.drop_path3(self.ls3(self.attn(self.norm4(query)))) + query = query + self.drop_path4(self.ls4(self.mlp2(self.norm5(query)))) + return query + + +class VisionTransformer(timm.models.vision_transformer.VisionTransformer): + """ Vision Transformer with support for global average pooling + """ + def __init__(self, global_pool=False, **kwargs): + init_values = kwargs.pop('init_values') + super(VisionTransformer, self).__init__(**kwargs) + + drop_path_rate = kwargs['drop_path_rate'] + depth = kwargs['depth'] + dpr = [x.item() for x in torch.linspace(0, drop_path_rate, depth)] # stochastic depth decay rule + self.blocks = nn.Sequential(*[ + Block( + dim=kwargs['embed_dim'], num_heads=kwargs['num_heads'], mlp_ratio=kwargs['mlp_ratio'], qkv_bias=kwargs['qkv_bias'], + init_values=init_values, norm_layer=kwargs['norm_layer'], drop_path=dpr[i]) + for i in range(kwargs['depth'])]) + + self.global_pool = global_pool + norm_layer = kwargs['norm_layer'] + embed_dim = kwargs['embed_dim'] + if self.global_pool: + self.fc_norm = norm_layer(embed_dim) + + del self.norm # remove the original norm + + # remove cls token embedding + # delattr(self, 'cls_token') + + num_patches = self.patch_embed.num_patches + if self.global_pool: + self.pos_embed = nn.Parameter(torch.zeros(1, num_patches+1, embed_dim), requires_grad=False) + else: + self.pos_embed = nn.Parameter(torch.zeros(1, num_patches, embed_dim), requires_grad=False) + self.cls_pos_embed = nn.Parameter(torch.zeros(1, 1, embed_dim), requires_grad=False) + + def forward_features(self, x): + B = x.shape[0] + x = self.patch_embed(x) + + cls_tokens = self.cls_token.expand(B, -1, -1) # stole cls_tokens impl from Phil Wang, thanks + x = torch.cat((cls_tokens, x), dim=1) + x = x + self.pos_embed + x = self.pos_drop(x) + + for blk in self.blocks: + x = blk(x) + + outcome = x + + return outcome + + def forward_head(self, x, pre_logits: bool = False): + if self.global_pool: + x = x[:, 1:, :].mean(dim=1) + else: + x[:, 0] + x = self.fc_norm(x) + return x if pre_logits else self.head(x) + + +def vit_base_patch16(**kwargs): + model = VisionTransformer( + patch_size=16, embed_dim=768, depth=12, num_heads=12, mlp_ratio=4, qkv_bias=True, + norm_layer=partial(LayerNorm, eps=1e-6), **kwargs) + return model + + +def vit_large_patch16(**kwargs): + model = VisionTransformer( + patch_size=16, embed_dim=1024, depth=24, num_heads=16, mlp_ratio=4, qkv_bias=True, + norm_layer=partial(LayerNorm, eps=1e-6), **kwargs) + return model + + +def vit_huge_patch14(**kwargs): + model = VisionTransformer( + patch_size=14, embed_dim=1280, depth=32, num_heads=16, mlp_ratio=4, qkv_bias=True, + norm_layer=partial(LayerNorm, eps=1e-6), **kwargs) + return model diff --git a/util/augmentation.py b/util/augmentation.py new file mode 100644 index 0000000..7259f7b --- /dev/null +++ b/util/augmentation.py @@ -0,0 +1,161 @@ +import math +import random + +from PIL import ImageFilter, ImageOps +import torch +import torchvision.transforms as transforms +import torchvision.transforms.functional as F + + +class RandomResizedCrop(transforms.RandomResizedCrop): + def __init__(self, cfg, *args, **kwargs): + super().__init__(*args, **kwargs) + self.args = cfg + + @staticmethod + def get_params(img, scale, ratio): + """Get parameters for ``crop`` for a random sized crop. + + Args: + img (PIL Image or Tensor): Input image. + scale (list): range of scale of the origin size cropped + ratio (list): range of aspect ratio of the origin aspect ratio cropped + + Returns: + tuple: params (i, j, h, w) to be passed to ``crop`` for a random + sized crop. + """ + if torch.__version__ == '1.11.0+cu113': + width, height = F.get_image_size(img) + else: + width, height = F._get_image_size(img) + area = height * width + + log_ratio = torch.log(torch.tensor(ratio)) + for _ in range(10): + target_area = area * torch.empty(1).uniform_(scale[0], scale[1]).item() + aspect_ratio = torch.exp(torch.empty(1).uniform_(log_ratio[0], log_ratio[1])).item() + + w = int(round(math.sqrt(target_area * aspect_ratio))) + h = int(round(math.sqrt(target_area / aspect_ratio))) + + if 0 < w <= width and 0 < h <= height: + i1 = torch.randint(0, height - h + 1, size=(1,)).item() + i2 = torch.randint(0, height - h + 1, size=(1,)).item() + j1 = torch.randint(0, width - w + 1, size=(1,)).item() + j2 = torch.randint(0, width - w + 1, size=(1,)).item() + + return i1, j1, i2, j2, h, w + + # Fallback to central crop + in_ratio = float(width) / float(height) + if in_ratio < min(ratio): + w = width + h = int(round(w / min(ratio))) + elif in_ratio > max(ratio): + h = height + w = int(round(h * max(ratio))) + else: # whole image + w = width + h = height + i = (height - h) // 2 + j = (width - w) // 2 + return i, j, i, j, h, w + + def forward(self, img): + """ + Args: + img (PIL Image or Tensor): Image to be cropped and resized. + + Returns: + PIL Image or Tensor: Randomly cropped and resized image. + """ + i1, j1, i2, j2, h, w = self.get_params(img, self.scale, self.ratio) + return F.resized_crop(img, i1, j1, h, w, self.size, self.interpolation), \ + F.resized_crop(img, i2, j2, h, w, self.size, self.interpolation), (i2-i1)/h, (j2-j1)/w, h/h, w/w + + +class GaussianBlur(object): + """Gaussian blur augmentation in SimCLR https://arxiv.org/abs/2002.05709""" + + def __init__(self, sigma=[.1, 2.]): + self.sigma = sigma + + def __call__(self, x): + sigma = random.uniform(self.sigma[0], self.sigma[1]) + x = x.filter(ImageFilter.GaussianBlur(radius=sigma)) + return x + + +class Solarize(object): + """Solarize augmentation from BYOL: https://arxiv.org/abs/2006.07733""" + + def __call__(self, x): + return ImageOps.solarize(x) + + +class SingleRandomResizedCrop(transforms.RandomResizedCrop): + @staticmethod + def get_params(img, scale, ratio): + """Get parameters for ``crop`` for a random sized crop. + + Args: + img (PIL Image or Tensor): Input image. + scale (list): range of scale of the origin size cropped + ratio (list): range of aspect ratio of the origin aspect ratio cropped + + Returns: + tuple: params (i, j, h, w) to be passed to ``crop`` for a random + sized crop. + """ + if torch.__version__ == '1.11.0+cu113': + width, height = F.get_image_size(img) + else: + width, height = F._get_image_size(img) + area = height * width + + log_ratio = torch.log(torch.tensor(ratio)) + for _ in range(10): + target_area = area * torch.empty(1).uniform_(scale[0], scale[1]).item() + aspect_ratio = torch.exp(torch.empty(1).uniform_(log_ratio[0], log_ratio[1])).item() + + w = int(round(math.sqrt(target_area * aspect_ratio))) + h = int(round(math.sqrt(target_area / aspect_ratio))) + + if 0 < w <= width and 0 < h <= height: + i = torch.randint(0, height - h + 1, size=(1,)).item() + j = torch.randint(0, width - w + 1, size=(1,)).item() + return i, j, h, w, width + + # Fallback to central crop + in_ratio = float(width) / float(height) + if in_ratio < min(ratio): + w = width + h = int(round(w / min(ratio))) + elif in_ratio > max(ratio): + h = height + w = int(round(h * max(ratio))) + else: # whole image + w = width + h = height + i = (height - h) // 2 + j = (width - w) // 2 + return i, j, h, w, width + + def forward(self, img): + """ + Args: + img (PIL Image or Tensor): Image to be cropped and resized. + + Returns: + PIL Image or Tensor: Randomly cropped and resized image. + """ + i, j, h, w, width = self.get_params(img, self.scale, self.ratio) + return F.resized_crop(img, i, j, h, w, self.size, self.interpolation), i, j, h, w, width + + +class RandomHorizontalFlip(transforms.RandomHorizontalFlip): + def forward(self, img): + if torch.rand(1) < self.p: + return F.hflip(img), True + return img, False \ No newline at end of file diff --git a/util/crop.py b/util/crop.py new file mode 100644 index 0000000..7aff92d --- /dev/null +++ b/util/crop.py @@ -0,0 +1,44 @@ +# ------------------------------------------------------------------------ +# SiameseIM +# Copyright (c) SenseTime. All Rights Reserved. +# ------------------------------------------------------------------------ +# Modified from MAE (https://github.com/facebookresearch/mae) +# Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved. +# ------------------------------------------------------------------------ + +import math + +import torch + +from torchvision import transforms +from torchvision.transforms import functional as F + + +class RandomResizedCrop(transforms.RandomResizedCrop): + """ + RandomResizedCrop for matching TF/TPU implementation: no for-loop is used. + This may lead to results different with torchvision's version. + Following BYOL's TF code: + https://github.com/deepmind/deepmind-research/blob/master/byol/utils/dataset.py#L206 + """ + @staticmethod + def get_params(img, scale, ratio): + width, height = F.get_image_size(img) + area = height * width + + target_area = area * torch.empty(1).uniform_(scale[0], scale[1]).item() + log_ratio = torch.log(torch.tensor(ratio)) + aspect_ratio = torch.exp( + torch.empty(1).uniform_(log_ratio[0], log_ratio[1]) + ).item() + + w = int(round(math.sqrt(target_area * aspect_ratio))) + h = int(round(math.sqrt(target_area / aspect_ratio))) + + w = min(w, width) + h = min(h, height) + + i = torch.randint(0, height - h + 1, size=(1,)).item() + j = torch.randint(0, width - w + 1, size=(1,)).item() + + return i, j, h, w diff --git a/util/datasets.py b/util/datasets.py new file mode 100644 index 0000000..43df78e --- /dev/null +++ b/util/datasets.py @@ -0,0 +1,85 @@ +# ------------------------------------------------------------------------ +# SiameseIM +# Copyright (c) SenseTime. All Rights Reserved. +# ------------------------------------------------------------------------ +# Modified from MAE (https://github.com/facebookresearch/mae) +# Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved. +# ------------------------------------------------------------------------ +# References: +# DeiT: https://github.com/facebookresearch/deit +# ------------------------------------------------------------------------ + +import os +import PIL + +from torchvision import datasets, transforms + +from timm.data import create_transform +from timm.data.constants import IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD + + +def build_transform(is_train, args): + mean = IMAGENET_DEFAULT_MEAN + std = IMAGENET_DEFAULT_STD + # train transform + if is_train: + # this should always dispatch to transforms_imagenet_train + transform = create_transform( + input_size=args.input_size, + is_training=True, + color_jitter=args.color_jitter, + auto_augment=args.aa, + interpolation='bicubic', + re_prob=args.reprob, + re_mode=args.remode, + re_count=args.recount, + mean=mean, + std=std, + ) + return transform + + # eval transform + t = [] + if args.input_size <= 224: + crop_pct = 224 / 256 + else: + crop_pct = 1.0 + size = int(args.input_size / crop_pct) + t.append( + transforms.Resize(size, interpolation=PIL.Image.BICUBIC), # to maintain same ratio w.r.t. 224 images + ) + t.append(transforms.CenterCrop(args.input_size)) + + t.append(transforms.ToTensor()) + t.append(transforms.Normalize(mean, std)) + return transforms.Compose(t) + + +class ImagenetWithMask(datasets.ImageFolder): + def __init__(self, root, + transform = None, + with_blockwise_mask=False, ### !!! set to True, enable blockwise masking + blockwise_num_masking_patches=75, ### !!! 75 / 196 = 0.38 -> Modify this to increase mask ratio + input_size=224, patch_size=16, # no need to change now + max_mask_patches_per_block=None, # BEiT default setting, no need to change + min_mask_patches_per_block=16, # BEiT default setting, no need to change + fixed_num_masking_patches=True, ### set to true, fixed number of masking patch to blockwise_num_masking_patches for sim training + ): + super().__init__(root, transform) + self.with_blockwise_mask = with_blockwise_mask + if with_blockwise_mask: + from .masking_generator import MaskingGenerator + window_size = input_size // patch_size + self.masked_position_generator = MaskingGenerator( + (window_size, window_size), + num_masking_patches=blockwise_num_masking_patches, + max_num_patches=max_mask_patches_per_block, + min_num_patches=min_mask_patches_per_block, + fixed_num_masking_patches=fixed_num_masking_patches + ) + + def __getitem__(self, index): + sample, target = super().__getitem__(index) + if self.with_blockwise_mask: + return sample, target, self.masked_position_generator() + return sample, target diff --git a/util/lars.py b/util/lars.py new file mode 100644 index 0000000..09b1ed2 --- /dev/null +++ b/util/lars.py @@ -0,0 +1,49 @@ +# ------------------------------------------------------------------------ +# SiameseIM +# Copyright (c) SenseTime. All Rights Reserved. +# ------------------------------------------------------------------------ +# Modified from MAE (https://github.com/facebookresearch/mae) +# Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved. +# ------------------------------------------------------------------------ +# LARS optimizer, implementation from MoCo v3: +# https://github.com/facebookresearch/moco-v3 +# ------------------------------------------------------------------------ + + +import torch + + +class LARS(torch.optim.Optimizer): + """ + LARS optimizer, no rate scaling or weight decay for parameters <= 1D. + """ + def __init__(self, params, lr=0, weight_decay=0, momentum=0.9, trust_coefficient=0.001): + defaults = dict(lr=lr, weight_decay=weight_decay, momentum=momentum, trust_coefficient=trust_coefficient) + super().__init__(params, defaults) + + @torch.no_grad() + def step(self): + for g in self.param_groups: + for p in g['params']: + dp = p.grad + + if dp is None: + continue + + if p.ndim > 1: # if not normalization gamma/beta or bias + dp = dp.add(p, alpha=g['weight_decay']) + param_norm = torch.norm(p) + update_norm = torch.norm(dp) + one = torch.ones_like(param_norm) + q = torch.where(param_norm > 0., + torch.where(update_norm > 0, + (g['trust_coefficient'] * param_norm / update_norm), one), + one) + dp = dp.mul(q) + + param_state = self.state[p] + if 'mu' not in param_state: + param_state['mu'] = torch.zeros_like(p) + mu = param_state['mu'] + mu.mul_(g['momentum']).add_(dp) + p.add_(mu, alpha=-g['lr']) diff --git a/util/lr_decay.py b/util/lr_decay.py new file mode 100644 index 0000000..5bbc42b --- /dev/null +++ b/util/lr_decay.py @@ -0,0 +1,91 @@ +# ------------------------------------------------------------------------ +# SiameseIM +# Copyright (c) SenseTime. All Rights Reserved. +# ------------------------------------------------------------------------ +# Modified from MAE (https://github.com/facebookresearch/mae) +# Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved. +# ------------------------------------------------------------------------ +# References: +# ELECTRA https://github.com/google-research/electra +# BEiT: https://github.com/microsoft/unilm/tree/master/beit +# ------------------------------------------------------------------------ + +import json + + +def param_groups_lrd(model, weight_decay=0.05, no_weight_decay_list=[], layer_decay=.75, + small_lr_keywords=('offset',), small_lr_ratio=0.1): + """ + Parameter groups for layer-wise lr decay + Following BEiT: https://github.com/microsoft/unilm/blob/master/beit/optim_factory.py#L58 + """ + param_group_names = {} + param_groups = {} + + if hasattr(model, 'blocks'): + num_layers = len(model.blocks) + 1 + else: + raise NotImplementedError + + layer_scales = list(layer_decay ** (num_layers - i) for i in range(num_layers + 1)) + + for n, p in model.named_parameters(): + if not p.requires_grad: + continue + + small_lr = False + for small_lr_keyword in small_lr_keywords: + if small_lr_keyword in n: + g_decay = 'decay_small_lr' + this_decay = weight_decay + layer_id = get_layer_id_for_vit(n, num_layers) + group_name = "layer_%d_%s" % (layer_id, g_decay) + small_lr = True + this_scale = layer_scales[layer_id] * 0.1 + + if not small_lr: + # no decay: all 1D parameters and model specific ones + if p.ndim == 1 or n in no_weight_decay_list: + g_decay = "no_decay" + this_decay = 0. + else: + g_decay = "decay" + this_decay = weight_decay + + layer_id = get_layer_id_for_vit(n, num_layers) + group_name = "layer_%d_%s" % (layer_id, g_decay) + this_scale = layer_scales[layer_id] + + if group_name not in param_group_names: + param_group_names[group_name] = { + "lr_scale": this_scale, + "weight_decay": this_decay, + "params": [], + } + param_groups[group_name] = { + "lr_scale": this_scale, + "weight_decay": this_decay, + "params": [], + } + + param_group_names[group_name]["params"].append(n) + param_groups[group_name]["params"].append(p) + + print("parameter groups: \n%s" % json.dumps(param_group_names, indent=2)) + + return list(param_groups.values()) + + +def get_layer_id_for_vit(name, num_layers): + """ + Assign a parameter with its layer id + Following BEiT: https://github.com/microsoft/unilm/blob/master/beit/optim_factory.py#L33 + """ + if name in ['cls_token', 'pos_embed']: + return 0 + elif name.startswith('patch_embed'): + return 0 + elif name.startswith('blocks'): + return int(name.split('.')[1]) + 1 + else: + return num_layers diff --git a/util/lr_sched.py b/util/lr_sched.py new file mode 100644 index 0000000..a277562 --- /dev/null +++ b/util/lr_sched.py @@ -0,0 +1,24 @@ +# ------------------------------------------------------------------------ +# SiameseIM +# Copyright (c) SenseTime. All Rights Reserved. +# ------------------------------------------------------------------------ +# Modified from MAE (https://github.com/facebookresearch/mae) +# Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved. +# ------------------------------------------------------------------------ + + +import math + +def adjust_learning_rate(optimizer, epoch, args): + """Decay the learning rate with half-cycle cosine after warmup""" + if epoch < args.warmup_epochs: + lr = args.lr * epoch / args.warmup_epochs + else: + lr = args.min_lr + (args.lr - args.min_lr) * 0.5 * \ + (1. + math.cos(math.pi * (epoch - args.warmup_epochs) / (args.epochs - args.warmup_epochs))) + for param_group in optimizer.param_groups: + if "lr_scale" in param_group: + param_group["lr"] = lr * param_group["lr_scale"] + else: + param_group["lr"] = lr + return lr diff --git a/util/masking_generator.py b/util/masking_generator.py new file mode 100644 index 0000000..03cbf8f --- /dev/null +++ b/util/masking_generator.py @@ -0,0 +1,132 @@ +# ------------------------------------------------------------------------ +# SiameseIM +# Copyright (c) SenseTime. All Rights Reserved. +# ------------------------------------------------------------------------ +""" +Originally inspired by impl at https://github.com/zhunzhong07/Random-Erasing, Apache 2.0 +Copyright Zhun Zhong & Liang Zheng + +Hacked together by / Copyright 2020 Ross Wightman + +Modified by Hangbo Bao, for generating the masked position for visual image transformer +""" +# -------------------------------------------------------- +# BEIT: BERT Pre-Training of Image Transformers (https://arxiv.org/abs/2106.08254) +# Github source: https://github.com/microsoft/unilm/tree/master/beit +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# By Hangbo Bao +# Based on timm, DINO and DeiT code bases +# https://github.com/rwightman/pytorch-image-models/tree/master/timm +# Originally inspired by impl at https://github.com/zhunzhong07/Random-Erasing, Apache 2.0 +# Copyright Zhun Zhong & Liang Zheng +# +# Hacked together by / Copyright 2020 Ross Wightman +# +# Modified by Hangbo Bao, for generating the masked position for visual image transformer +# --------------------------------------------------------' +import random +import math +import numpy as np + + +class MaskingGenerator: + def __init__( + self, input_size, num_masking_patches, min_num_patches=4, max_num_patches=None, + min_aspect=0.3, max_aspect=None, fixed_num_masking_patches=False): + if not isinstance(input_size, tuple): + input_size = (input_size, ) * 2 + self.height, self.width = input_size + + self.num_patches = self.height * self.width + self.num_masking_patches = num_masking_patches + + self.min_num_patches = min_num_patches + self.max_num_patches = num_masking_patches if max_num_patches is None else max_num_patches + + max_aspect = max_aspect or 1 / min_aspect + self.log_aspect_ratio = (math.log(min_aspect), math.log(max_aspect)) + self.fixed_num_masking_patches = fixed_num_masking_patches + + def __repr__(self): + repr_str = "Generator(%d, %d -> [%d ~ %d], max = %d, %.3f ~ %.3f)" % ( + self.height, self.width, self.min_num_patches, self.max_num_patches, + self.num_masking_patches, self.log_aspect_ratio[0], self.log_aspect_ratio[1]) + return repr_str + + def get_shape(self): + return self.height, self.width + + def _mask(self, mask, max_mask_patches): + delta = 0 + for attempt in range(10): + target_area = random.uniform(self.min_num_patches, max_mask_patches) + aspect_ratio = math.exp(random.uniform(*self.log_aspect_ratio)) + h = int(round(math.sqrt(target_area * aspect_ratio))) + w = int(round(math.sqrt(target_area / aspect_ratio))) + if w < self.width and h < self.height: + top = random.randint(0, self.height - h) + left = random.randint(0, self.width - w) + + num_masked = mask[top: top + h, left: left + w].sum() + # Overlap + if 0 < h * w - num_masked <= max_mask_patches: + for i in range(top, top + h): + for j in range(left, left + w): + if mask[i, j] == 0: + mask[i, j] = 1 + delta += 1 + + if delta > 0: + break + return delta + + def __call__(self): + mask = np.zeros(shape=self.get_shape(), dtype=np.int) + mask_count = 0 + while mask_count < self.num_masking_patches: + max_mask_patches = self.num_masking_patches - mask_count + max_mask_patches = min(max_mask_patches, self.max_num_patches) + + delta = self._mask(mask, max_mask_patches) + if delta == 0: + break + else: + mask_count += delta + + if self.fixed_num_masking_patches and (mask_count < self.num_masking_patches): + non_masked_inds_i, non_masked_inds_j = (mask == 0).nonzero() + shuffle_inds = list(range(non_masked_inds_i.shape[0])) + random.shuffle(shuffle_inds) + num_to_mask = self.num_masking_patches - mask_count + to_mask_inds_i = non_masked_inds_i[shuffle_inds[:num_to_mask]] + to_mask_inds_j = non_masked_inds_j[shuffle_inds[:num_to_mask]] + mask[to_mask_inds_i, to_mask_inds_j] = 1 + mask_count += num_to_mask + + return mask + + +if __name__ == '__main__': + blockwise_num_masking_patches=75 ### TODO: 75 / 196 = 0.38 -> Modify this to increase mask ratio + input_size=224 + patch_size=16 # BEiT default setting, no need to change + max_mask_patches_per_block=None # BEiT default setting, no need to change + min_mask_patches_per_block=16 # BEiT default setting, no need to change + fixed_num_masking_patches=True ### TODO: fixed number of masking patch to blockwise_num_masking_patches for sim training + window_size = input_size // patch_size + masked_position_generator = MaskingGenerator( + (window_size, window_size), + num_masking_patches=blockwise_num_masking_patches, + max_num_patches=max_mask_patches_per_block, + min_num_patches=min_mask_patches_per_block, + fixed_num_masking_patches=fixed_num_masking_patches + ) + mask_num = [] + for _ in range(10000): + mask = masked_position_generator() + if _ < 10: + print(mask) + mask_num.append(mask.sum()) + print(f"Max Patches: {max(mask_num)} Min Patches: {min(mask_num)} Mean Patches: {sum(mask_num) / len(mask_num)}") + print(f"Max Ratio: {max(mask_num)/196.0} Min Ratio: {min(mask_num)/196.0} Mean Ratio: {sum(mask_num) / len(mask_num) / 196.0}") diff --git a/util/misc.py b/util/misc.py new file mode 100644 index 0000000..459560f --- /dev/null +++ b/util/misc.py @@ -0,0 +1,593 @@ +# ------------------------------------------------------------------------ +# SiameseIM +# Copyright (c) SenseTime. All Rights Reserved. +# ------------------------------------------------------------------------ +# Modified from MAE (https://github.com/facebookresearch/mae) +# Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved. +# ------------------------------------------------------------------------ +# References: +# DeiT: https://github.com/facebookresearch/deit +# BEiT: https://github.com/microsoft/unilm/tree/master/beit +# ------------------------------------------------------------------------ + + +import builtins +import datetime +import os +import io +import time +from collections import defaultdict, deque +from pathlib import Path + +import torch +import torch.distributed as dist +from torch._six import inf +import torch.nn as nn +import torch.nn.functional as F + + +class SmoothedValue(object): + """Track a series of values and provide access to smoothed values over a + window or the global series average. + """ + + def __init__(self, window_size=20, fmt=None): + if fmt is None: + fmt = "{median:.4f} ({global_avg:.4f})" + self.deque = deque(maxlen=window_size) + self.total = 0.0 + self.count = 0 + self.fmt = fmt + + def update(self, value, n=1): + self.deque.append(value) + self.count += n + self.total += value * n + + def synchronize_between_processes(self): + """ + Warning: does not synchronize the deque! + """ + if not is_dist_avail_and_initialized(): + return + t = torch.tensor([self.count, self.total], dtype=torch.float64, device='cuda') + dist.barrier() + dist.all_reduce(t) + t = t.tolist() + self.count = int(t[0]) + self.total = t[1] + + @property + def median(self): + d = torch.tensor(list(self.deque)) + return d.median().item() + + @property + def avg(self): + d = torch.tensor(list(self.deque), dtype=torch.float32) + return d.mean().item() + + @property + def global_avg(self): + return self.total / self.count + + @property + def max(self): + return max(self.deque) + + @property + def value(self): + return self.deque[-1] + + def __str__(self): + return self.fmt.format( + median=self.median, + avg=self.avg, + global_avg=self.global_avg, + max=self.max, + value=self.value) + + +class MetricLogger(object): + def __init__(self, delimiter="\t"): + self.meters = defaultdict(SmoothedValue) + self.delimiter = delimiter + + def update(self, **kwargs): + for k, v in kwargs.items(): + if v is None: + continue + if isinstance(v, torch.Tensor): + v = v.item() + assert isinstance(v, (float, int)) + self.meters[k].update(v) + + def __getattr__(self, attr): + if attr in self.meters: + return self.meters[attr] + if attr in self.__dict__: + return self.__dict__[attr] + raise AttributeError("'{}' object has no attribute '{}'".format( + type(self).__name__, attr)) + + def __str__(self): + loss_str = [] + for name, meter in self.meters.items(): + loss_str.append( + "{}: {}".format(name, str(meter)) + ) + return self.delimiter.join(loss_str) + + def synchronize_between_processes(self): + for meter in self.meters.values(): + meter.synchronize_between_processes() + + def add_meter(self, name, meter): + self.meters[name] = meter + + def log_every(self, iterable, print_freq, header=None): + i = 0 + if not header: + header = '' + start_time = time.time() + end = time.time() + iter_time = SmoothedValue(fmt='{avg:.4f}') + data_time = SmoothedValue(fmt='{avg:.4f}') + space_fmt = ':' + str(len(str(len(iterable)))) + 'd' + log_msg = [ + header, + '[{0' + space_fmt + '}/{1}]', + 'eta: {eta}', + '{meters}', + 'time: {time}', + 'data: {data}' + ] + if torch.cuda.is_available(): + log_msg.append('max mem: {memory:.0f}') + log_msg = self.delimiter.join(log_msg) + MB = 1024.0 * 1024.0 + for obj in iterable: + data_time.update(time.time() - end) + yield obj + iter_time.update(time.time() - end) + if i % print_freq == 0 or i == len(iterable) - 1: + eta_seconds = iter_time.global_avg * (len(iterable) - i) + eta_string = str(datetime.timedelta(seconds=int(eta_seconds))) + if torch.cuda.is_available(): + print(log_msg.format( + i, len(iterable), eta=eta_string, + meters=str(self), + time=str(iter_time), data=str(data_time), + memory=torch.cuda.max_memory_allocated() / MB)) + else: + print(log_msg.format( + i, len(iterable), eta=eta_string, + meters=str(self), + time=str(iter_time), data=str(data_time))) + i += 1 + end = time.time() + total_time = time.time() - start_time + total_time_str = str(datetime.timedelta(seconds=int(total_time))) + print('{} Total time: {} ({:.4f} s / it)'.format( + header, total_time_str, total_time / len(iterable))) + + +def setup_for_distributed(is_master): + """ + This function disables printing when not in master process + """ + builtin_print = builtins.print + + def print(*args, **kwargs): + force = kwargs.pop('force', False) + # force = force or (get_world_size() > 8) + if is_master or force: + now = datetime.datetime.now().time() + builtin_print('[{}] '.format(now), end='') # print with time stamp + builtin_print(*args, **kwargs) + + builtins.print = print + + +def is_dist_avail_and_initialized(): + if not dist.is_available(): + return False + if not dist.is_initialized(): + return False + return True + + +def get_world_size(): + if not is_dist_avail_and_initialized(): + return 1 + return dist.get_world_size() + + +def get_rank(): + if not is_dist_avail_and_initialized(): + return 0 + return dist.get_rank() + + +def is_main_process(): + return get_rank() == 0 + + +def save_on_master(*args, **kwargs): + if is_main_process(): + torch.save(*args, **kwargs) + + +def init_distributed_mode(args): + if args.dist_on_itp: + args.rank = int(os.environ['OMPI_COMM_WORLD_RANK']) + args.world_size = int(os.environ['OMPI_COMM_WORLD_SIZE']) + args.gpu = int(os.environ['OMPI_COMM_WORLD_LOCAL_RANK']) + args.dist_url = "tcp://%s:%s" % (os.environ['MASTER_ADDR'], os.environ['MASTER_PORT']) + os.environ['LOCAL_RANK'] = str(args.gpu) + os.environ['RANK'] = str(args.rank) + os.environ['WORLD_SIZE'] = str(args.world_size) + # ["RANK", "WORLD_SIZE", "MASTER_ADDR", "MASTER_PORT", "LOCAL_RANK"] + elif 'RANK' in os.environ and 'WORLD_SIZE' in os.environ: + args.rank = int(os.environ["RANK"]) + args.world_size = int(os.environ['WORLD_SIZE']) + args.gpu = int(os.environ['LOCAL_RANK']) + elif 'SLURM_PROCID' in os.environ: + args.rank = int(os.environ['SLURM_PROCID']) + args.world_size = int(os.environ['SLURM_NTASKS']) + node_list = os.environ['SLURM_STEP_NODELIST'] + num_gpus = torch.cuda.device_count() + args.gpu = args.rank % torch.cuda.device_count() + torch.cuda.set_device(args.rank % num_gpus) + import subprocess + addr = subprocess.getoutput( + f'scontrol show hostname {node_list} | head -n1') + # specify master port + if hasattr(args, 'port'): + os.environ['MASTER_PORT'] = str(args.port) + elif 'MASTER_PORT' in os.environ: + pass # use MASTER_PORT in the environment variable + else: + # 29500 is torch.distributed default port + os.environ['MASTER_PORT'] = '28506' + # use MASTER_ADDR in the environment variable if it already exists + if 'MASTER_ADDR' not in os.environ: + os.environ['MASTER_ADDR'] = addr + os.environ['WORLD_SIZE'] = str(args.world_size) + os.environ['LOCAL_RANK'] = str(args.rank % num_gpus) + os.environ['LOCAL_SIZE'] = str(num_gpus) + os.environ['RANK'] = str(args.rank) + # dist.init_process_group(backend='nccl') + else: + print('Not using distributed mode') + setup_for_distributed(is_master=True) # hack + args.distributed = False + return + + args.distributed = True + + torch.cuda.set_device(args.gpu) + args.dist_backend = 'nccl' + print('| distributed init (rank {}): {}, gpu {}'.format( + args.rank, args.dist_url, args.gpu), flush=True) + torch.distributed.init_process_group(backend=args.dist_backend, init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + torch.distributed.barrier() + setup_for_distributed(args.rank == 0) + + +class NativeScalerWithGradNormCount: + state_dict_key = "amp_scaler" + + def __init__(self, enabled=True, growth_interval=2000): + self.enabled = enabled + self._scaler = torch.cuda.amp.GradScaler( + enabled=enabled, growth_interval=growth_interval) + + def __call__(self, loss, optimizer, clip_grad=None, parameters=None, create_graph=False, update_grad=True): + self._scaler.scale(loss).backward(create_graph=create_graph) + if update_grad: + if clip_grad is not None: + assert parameters is not None + self._scaler.unscale_(optimizer) # unscale the gradients of optimizer's assigned params in-place + norm = torch.nn.utils.clip_grad_norm_(parameters, clip_grad) + else: + self._scaler.unscale_(optimizer) + norm = get_grad_norm_(parameters) + self._scaler.step(optimizer) + self._scaler.update() + else: + norm = None + return norm + + def state_dict(self): + return self._scaler.state_dict() + + def load_state_dict(self, state_dict): + if self.enabled: + self._scaler.load_state_dict(state_dict) + + +def get_grad_norm_(parameters, norm_type: float = 2.0) -> torch.Tensor: + if isinstance(parameters, torch.Tensor): + parameters = [parameters] + parameters = [p for p in parameters if p.grad is not None] + norm_type = float(norm_type) + if len(parameters) == 0: + return torch.tensor(0.) + device = parameters[0].grad.device + if norm_type == inf: + total_norm = max(p.grad.detach().abs().max().to(device) for p in parameters) + else: + total_norm = torch.norm(torch.stack([torch.norm(p.grad.detach(), norm_type).to(device) for p in parameters]), norm_type) + return total_norm + + +def save_model(args, epoch, model, model_without_ddp, optimizer, loss_scaler, + latest=False, + latest_postfix='latest'): + output_dir = Path(args.output_dir) + epoch_name = str(epoch) + if loss_scaler is not None: + checkpoint_paths = [] + if latest: + checkpoint_paths = [output_dir / (f'checkpoint-{latest_postfix}.pth')] + else: + checkpoint_paths = [output_dir / ('checkpoint-%s.pth' % epoch_name)] + to_save = { + 'model': model_without_ddp.state_dict(), + 'optimizer': optimizer.state_dict(), + 'epoch': epoch, + 'scaler': loss_scaler.state_dict(), + 'args': args, + } + for checkpoint_path in checkpoint_paths: + save_on_master(to_save, checkpoint_path) + else: + client_state = {'epoch': epoch} + model.save_checkpoint(save_dir=args.output_dir, tag="checkpoint-%s" % epoch_name, client_state=client_state) + + +def load_model(args, model_without_ddp, optimizer, loss_scaler): + if args.resume: + if args.resume.startswith('https'): + checkpoint = torch.hub.load_state_dict_from_url( + args.resume, map_location='cpu', check_hash=True) + else: + checkpoint = torch.load(args.resume, map_location='cpu') + model_without_ddp.load_state_dict(checkpoint['model']) + print("Resume checkpoint %s" % args.resume) + if 'optimizer' in checkpoint and 'epoch' in checkpoint and not (hasattr(args, 'eval') and args.eval): + optimizer.load_state_dict(checkpoint['optimizer']) + args.start_epoch = checkpoint['epoch'] + 1 + if 'scaler' in checkpoint: + loss_scaler.load_state_dict(checkpoint['scaler']) + print("With optim & sched!") + + +def auto_load_model(args, model_without_ddp, optimizer, loss_scaler): + # torch.amp + output_dir = Path(args.output_dir) + + if args.auto_resume and len(args.resume) == 0: + import glob + all_checkpoints = glob.glob(os.path.join(output_dir, 'checkpoint-*.pth')) + latest_ckpt = -1 + for ckpt in all_checkpoints: + t = ckpt.split('-')[-1].split('.')[0] + if t.isdigit(): + latest_ckpt = max(int(t), latest_ckpt) + if latest_ckpt >= 0: + args.resume = os.path.join(output_dir, 'checkpoint-%d.pth' % latest_ckpt) + if os.path.exists(os.path.join(output_dir, 'checkpoint-latest.pth')): + args.resume = os.path.join(output_dir, 'checkpoint-latest.pth') + print("Auto resume checkpoint: %s" % args.resume) + + if args.resume: + if args.resume.startswith('https'): + checkpoint = torch.hub.load_state_dict_from_url( + args.resume, map_location='cpu', check_hash=True) + else: + checkpoint = torch.load(args.resume, map_location='cpu') + model_without_ddp.load_state_dict(checkpoint['model'], strict=False) + print("Resume checkpoint %s" % args.resume) + if 'optimizer' in checkpoint and 'epoch' in checkpoint: + optimizer.load_state_dict(checkpoint['optimizer']) + args.start_epoch = checkpoint['epoch'] + 1 + if 'scaler' in checkpoint: + loss_scaler.load_state_dict(checkpoint['scaler']) + print("With optim & sched!") + + +def all_reduce_mean(x): + world_size = get_world_size() + if world_size > 1: + x_reduce = torch.tensor(x).cuda() + dist.all_reduce(x_reduce) + x_reduce /= world_size + return x_reduce.item() + else: + return x + + +class LayerNorm(nn.LayerNorm): + + @torch.cuda.amp.autocast(enabled=False) + def forward(self, input): + return super(LayerNorm, self).forward(input.float()) + + +def add_lr_weight_decay(model, weight_decay=1e-5, lr=1e-4, skip_list=()): + decay = [] + no_decay = [] + no_decay_names = [] + decay_small_lr = [] + decay_small_lr_names = [] + for name, param in model.named_parameters(): + if not param.requires_grad: + continue # frozen weights + if 'offset' in name: + decay_small_lr.append(param) + decay_small_lr_names.append(name) + + elif len(param.shape) == 1 or name.endswith(".bias") or name in skip_list: + no_decay.append(param) + no_decay_names.append(name) + else: + decay.append(param) + print(f'decay_small_lr_names: {decay_small_lr_names}') + print(f'no_decay_names: {no_decay_names}') + return [ + {'params': no_decay, 'weight_decay': 0., 'lr': lr}, + {'params': decay, 'weight_decay': weight_decay, 'lr': lr}, + {'params': decay_small_lr, 'weight_decay': weight_decay, 'lr': lr*0.1}, + ] + + + +import math +from torch.utils.data.sampler import Sampler + + +class NodeDistributedSampler(Sampler): + """Sampler that restricts data loading to a subset of the dataset. + It is especially useful in conjunction with + :class:`torch.nn.parallel.DistributedDataParallel`. In such case, each + process can pass a DistributedSampler instance as a DataLoader sampler, + and load a subset of the original dataset that is exclusive to it. + .. note:: + Dataset is assumed to be of constant size. + Arguments: + dataset: Dataset used for sampling. + num_replicas (optional): Number of processes participating in + distributed training. + rank (optional): Rank of the current process within num_replicas. + """ + + def __init__(self, dataset, num_replicas=None, rank=None, local_rank=None, local_size=None, shuffle=True): + if num_replicas is None: + if not dist.is_available(): + raise RuntimeError("Requires distributed package to be available") + num_replicas = dist.get_world_size() + if rank is None: + if not dist.is_available(): + raise RuntimeError("Requires distributed package to be available") + rank = dist.get_rank() + if local_rank is None: + local_rank = int(os.environ.get('LOCAL_RANK', 0)) + if local_size is None: + local_size = int(os.environ.get('LOCAL_SIZE', 1)) + self.dataset = dataset + self.shuffle = shuffle + self.num_replicas = num_replicas + self.num_parts = local_size + self.rank = rank + self.local_rank = local_rank + self.epoch = 0 + self.num_samples = int(math.ceil(len(self.dataset) * 1.0 / self.num_replicas)) + self.total_size = self.num_samples * self.num_replicas + + self.total_size_parts = self.num_samples * self.num_replicas // self.num_parts + + def __iter__(self): + if self.shuffle: + # deterministically shuffle based on epoch + g = torch.Generator() + g.manual_seed(self.epoch) + indices = torch.randperm(len(self.dataset), generator=g).tolist() + else: + indices = torch.arange(len(self.dataset)).tolist() + indices = [i for i in indices if i % self.num_parts == self.local_rank] + + # add extra samples to make it evenly divisible + indices += indices[:(self.total_size_parts - len(indices))] + assert len(indices) == self.total_size_parts + + # subsample + indices = indices[self.rank // self.num_parts:self.total_size_parts:self.num_replicas // self.num_parts] + assert len(indices) == self.num_samples + + return iter(indices) + + def __len__(self): + return self.num_samples + + def set_epoch(self, epoch): + self.epoch = epoch + + +class GatherLayer(torch.autograd.Function): + """Gather tensors from all process, supporting backward propagation. + """ + + @staticmethod + def forward(ctx, input): + ctx.save_for_backward(input) + output = [torch.zeros_like(input) for _ in range(dist.get_world_size())] + dist.all_gather(output, input) + return torch.stack(output, 0) + + @staticmethod + def backward(ctx, grads): + input, = ctx.saved_tensors + dist.all_reduce(grads) + grad_out = torch.zeros_like(input) + grad_out[:] = grads[dist.get_rank()] + return grad_out + + +class LabelSmoothingCrossEntropy(nn.Module): + """ + NLL loss with label smoothing. + """ + def __init__(self, smoothing=0.1): + """ + Constructor for the LabelSmoothing module. + :param smoothing: label smoothing factor + """ + super(LabelSmoothingCrossEntropy, self).__init__() + assert smoothing < 1.0 + self.smoothing = smoothing + self.confidence = 1. - smoothing + + def forward(self, x, target, reduction='mean'): + logprobs = F.log_softmax(x, dim=-1) + nll_loss = -logprobs.gather(dim=-1, index=target.unsqueeze(1)) + nll_loss = nll_loss.squeeze(1) + smooth_loss = -logprobs.mean(dim=-1) + loss = self.confidence * nll_loss + self.smoothing * smooth_loss + if reduction == 'mean': + return loss.mean() + elif reduction == 'none': + return loss + else: + raise NotImplementedError + + +class LabelSmoothingCrossEntropyWithSoftTarget(nn.Module): + """ + NLL loss with label smoothing. + """ + def __init__(self, smoothing=0.1): + """ + Constructor for the LabelSmoothing module. + :param smoothing: label smoothing factor + """ + super(LabelSmoothingCrossEntropyWithSoftTarget, self).__init__() + assert smoothing < 1.0 + self.smoothing = smoothing + self.confidence = 1. - smoothing + + def forward(self, x, target, reduction='mean'): + logprobs = F.log_softmax(x, dim=-1) + # nll_loss = -logprobs.gather(dim=-1, index=target.unsqueeze(1)) + # nll_loss = nll_loss.squeeze(1) + nll_loss = - (logprobs * target).sum(dim=-1) + smooth_loss = -logprobs.mean(dim=-1) + loss = self.confidence * nll_loss + self.smoothing * smooth_loss + if reduction == 'mean': + return loss.mean() + elif reduction == 'none': + return loss + else: + raise NotImplementedError diff --git a/util/pos_embed.py b/util/pos_embed.py new file mode 100644 index 0000000..1d3ee7b --- /dev/null +++ b/util/pos_embed.py @@ -0,0 +1,133 @@ +# ------------------------------------------------------------------------ +# SiameseIM +# Copyright (c) SenseTime. All Rights Reserved. +# ------------------------------------------------------------------------ +# Modified from MAE (https://github.com/facebookresearch/mae) +# Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved. +# ------------------------------------------------------------------------ + + +import numpy as np + +import torch + +# -------------------------------------------------------- +# 2D sine-cosine position embedding +# References: +# Transformer: https://github.com/tensorflow/models/blob/master/official/nlp/transformer/model_utils.py +# MoCo v3: https://github.com/facebookresearch/moco-v3 +# -------------------------------------------------------- +def get_2d_sincos_pos_embed(embed_dim, grid_size, cls_token=False): + """ + grid_size: int of the grid height and width + return: + pos_embed: [grid_size*grid_size, embed_dim] or [1+grid_size*grid_size, embed_dim] (w/ or w/o cls_token) + """ + grid_h = np.arange(grid_size, dtype=np.float32) + grid_w = np.arange(grid_size, dtype=np.float32) + grid = np.meshgrid(grid_w, grid_h) # here w goes first + grid = np.stack(grid, axis=0) + + grid = grid.reshape([2, 1, grid_size, grid_size]) + pos_embed = get_2d_sincos_pos_embed_from_grid(embed_dim, grid) + if cls_token: + pos_embed = np.concatenate([np.zeros([1, embed_dim]), pos_embed], axis=0) + return pos_embed + + +def get_2d_sincos_pos_embed_from_grid(embed_dim, grid): + assert embed_dim % 2 == 0 + + # use half of dimensions to encode grid_h + emb_h = get_1d_sincos_pos_embed_from_grid(embed_dim // 2, grid[1]) # (H*W, D/2) + emb_w = get_1d_sincos_pos_embed_from_grid(embed_dim // 2, grid[0]) # (H*W, D/2) + + emb = np.concatenate([emb_h, emb_w], axis=1) # (H*W, D) + return emb + + +def get_1d_sincos_pos_embed_from_grid(embed_dim, pos): + """ + embed_dim: output dimension for each position + pos: a list of positions to be encoded: size (M,) + out: (M, D) + """ + assert embed_dim % 2 == 0 + omega = np.arange(embed_dim // 2, dtype=np.float) + omega /= embed_dim / 2. + omega = 1. / 10000**omega # (D/2,) + + pos = pos.reshape(-1) # (M,) + out = np.einsum('m,d->md', pos, omega) # (M, D/2), outer product + + emb_sin = np.sin(out) # (M, D/2) + emb_cos = np.cos(out) # (M, D/2) + + emb = np.concatenate([emb_sin, emb_cos], axis=1) # (M, D) + return emb + + +def get_2d_sincos_pos_embed_relative(delta_i, delta_j, delta_h, delta_w, relative_flip, flip_delta_j, embed_dim, grid_size, cls_token=False): + """ + grid_size: int of the grid height and width + return: + pos_embed: [grid_size*grid_size, embed_dim] or [1+grid_size*grid_size, embed_dim] (w/ or w/o cls_token) + """ + delta_i = delta_i * grid_size + delta_j = delta_j * grid_size + flip_delta_j = flip_delta_j * grid_size + grid_h = torch.arange(grid_size, dtype=torch.float32) + grid_w = torch.arange(grid_size, dtype=torch.float32) + raw_grid_h, raw_grid_w = torch.meshgrid(grid_h, grid_w) + + raw_grid_h = raw_grid_h + 0.5 + raw_grid_w = raw_grid_w + 0.5 + grid_h = torch.einsum('b,n->bn', delta_h, raw_grid_h.flatten().to(delta_h)) + delta_i.unsqueeze(-1) + grid_w = torch.einsum('b,n->bn', delta_w, raw_grid_w.flatten().to(delta_w)) + delta_j.unsqueeze(-1) + + flip_grid_w = -torch.einsum('b,n->bn', [delta_w, raw_grid_w.flatten().to(delta_h)]) + flip_delta_j[:, None] + relative_flip = relative_flip.float().unsqueeze(-1) + grid_w = relative_flip * flip_grid_w + (1-relative_flip) * grid_w + grid_w = grid_w - 0.5 + grid_h = grid_h - 0.5 + + omega = torch.arange(embed_dim//4, dtype=torch.float32) / (embed_dim/4) + omega = 1. / (10000**omega) + out_h = torch.einsum('bn,c->bnc', [grid_h, omega.to(grid_h)]) + out_w = torch.einsum('bn,c->bnc', [grid_w, omega.to(grid_w)]) + out_scale_h = torch.einsum('b,c->bc', [10*torch.log(delta_h), omega.to(grid_h)]).unsqueeze(1).expand(-1, out_h.shape[1], -1) + out_scale_w = torch.einsum('b,c->bc', [10*torch.log(delta_w), omega.to(grid_w)]).unsqueeze(1).expand(-1, out_h.shape[1], -1) + pos_embed = torch.cat([torch.sin(out_h), torch.cos(out_h), torch.sin(out_w), torch.cos(out_w), + torch.sin(out_scale_h), torch.cos(out_scale_h), + torch.sin(out_scale_w), torch.cos(out_scale_w),], dim=2).detach() + + return pos_embed + + +# -------------------------------------------------------- +# Interpolate position embeddings for high-resolution +# References: +# DeiT: https://github.com/facebookresearch/deit +# -------------------------------------------------------- +def interpolate_pos_embed(model, checkpoint_model): + if 'pos_embed' in checkpoint_model: + pos_embed_checkpoint = checkpoint_model['pos_embed'] + embedding_size = pos_embed_checkpoint.shape[-1] + num_patches = model.patch_embed.num_patches + num_extra_tokens = model.pos_embed.shape[-2] - num_patches + # height (== width) for the checkpoint position embedding + orig_size = int((pos_embed_checkpoint.shape[-2] - num_extra_tokens) ** 0.5) + # height (== width) for the new position embedding + new_size = int(num_patches ** 0.5) + # class_token and dist_token are kept unchanged + if orig_size != new_size: + print("Position interpolate from %dx%d to %dx%d" % (orig_size, orig_size, new_size, new_size)) + extra_tokens = pos_embed_checkpoint[:, :num_extra_tokens] + # only the position tokens are interpolated + pos_tokens = pos_embed_checkpoint[:, num_extra_tokens:] + pos_tokens = pos_tokens.reshape(-1, orig_size, orig_size, embedding_size).permute(0, 3, 1, 2) + pos_tokens = torch.nn.functional.interpolate( + pos_tokens, size=(new_size, new_size), mode='bicubic', align_corners=False) + pos_tokens = pos_tokens.permute(0, 2, 3, 1).flatten(1, 2) + new_pos_embed = torch.cat((extra_tokens, pos_tokens), dim=1) + checkpoint_model['pos_embed'] = new_pos_embed diff --git a/util/tcs_datasets.py b/util/tcs_datasets.py new file mode 100644 index 0000000..71f472f --- /dev/null +++ b/util/tcs_datasets.py @@ -0,0 +1,202 @@ +# ------------------------------------------------------------------------ +# SiameseIM +# Copyright (c) SenseTime. All Rights Reserved. +# ------------------------------------------------------------------------ + + +import os +import io +from PIL import Image +from torch.utils.data import Dataset +import pyarrow as pa +import numpy as np +from io import BytesIO +import tqdm +from tqdm import trange +try: + from petrel_client.client import Client +except ImportError as E: + "petrel_client.client cannot be imported" + pass + + +def tcs_pil_loader(img_str): + buff = io.BytesIO(img_str) + return Image.open(buff) + + +class TCSLoader(object): + + def __init__(self, conf_path): + self.client = Client(conf_path) + + def __call__(self, fn): + try: + img_value_str = self.client.get(fn) + img = tcs_pil_loader(img_value_str) + except: + print('Read image failed ({})'.format(fn)) + return None + else: + return img + + +def _get_images(annotations): + images = [] + classes = [] + for line in annotations: + if isinstance(line, bytes): + line = line.decode() + image_name, cls = line.strip('\n').split() + images.append(image_name) + classes.append(cls) + return images, classes + + +class ImageNetTCSDatasetQK(Dataset): + def __init__(self, image_set, data_path, transform=None, use_tcs=False, + tcs_conf_path='/mnt/lustre/share_data/taochenxin/tcs/petreloss.conf', + test_mode=False, + on_memory=False, local_rank=None, local_size=None, + **kwargs): + ann_file = os.path.join(data_path, f'meta/{image_set}.txt') + data_path = os.path.join(data_path, image_set) + self.image_set = image_set + self.transform = transform + self.data_path = data_path + self.test_mode = test_mode + if use_tcs: + self.tcs_loader = TCSLoader(tcs_conf_path) + self.use_tcs = use_tcs + self.images, self.classes, self.class_to_idx = self._load_database(ann_file) + self.on_memory = on_memory + if on_memory: + if local_rank is None: + local_rank = int(os.environ.get('LOCAL_RANK', 0)) + if local_size is None: + local_size = int(os.environ.get('LOCAL_SIZE', 1)) + self.local_rank = local_rank + self.local_size = local_size + self.holder = {} + self.load_onto_memory() + + def load_onto_memory(self): + print("Loading images onto memory...") + for index in trange(len(self.images)): + if index % self.local_size != self.local_rank: + continue + path = self.images[index].as_py() + full_path = os.path.join(self.data_path, path) + if self.use_tcs: + sample = self.tcs_loader.client.get(full_path) + else: + with open(full_path, 'rb') as f: + sample = f.read() + self.holder[path] = sample + # print('Loading: path {}, full_path {}, data length {}'.format(path, full_path, + # len(self.tcs_loader.client.get(full_path)))) + print("Loading complete!") + + def _load_database(self, annotation_file): + if not self.use_tcs: + annotation_file = os.path.abspath(annotation_file) + print(f'loading annotations from {annotation_file} ...') + if self.use_tcs: + with BytesIO(self.tcs_loader.client.get(annotation_file)) as annotations: + images, classes = _get_images(annotations) + else: + with open(annotation_file, 'rt') as annotations: + images, classes = _get_images(annotations) + + # convert possible classes to indices + class_names = sorted(set(classes)) + # class_to_idx = {class_name: idx for idx, class_name in enumerate(class_names)} + class_to_idx = {class_name: int(class_name) for class_name in class_names} + return pa.array(images), pa.array([class_to_idx[class_name] for class_name in classes]), class_to_idx + + def __len__(self): + return len(self.images) + + def __getitem__(self, index): + path = self.images[index].as_py() + target = self.classes[index].as_py() + sample = self._load_image(path) + if self.transform is not None: + sample_q = self.transform(sample) + sample_k = self.transform(sample) + return sample_q, sample_k + else: + return sample, sample + + def _load_image(self, path): + full_path = os.path.join(self.data_path, path) + if self.on_memory: + try: + return Image.open(BytesIO(self.holder[path])).convert('RGB') + except: + print('error acquiring data from {}'.format(path)) + return self.tcs_loader(full_path).convert('RGB') + elif self.use_tcs: + return self.tcs_loader(full_path).convert('RGB') + else: + with open(full_path, 'rb') as f: + return Image.open(f).convert('RGB') + + +class ImagenetTCSDataset(ImageNetTCSDatasetQK): + def __init__(self, image_set, data_path, transform=None, use_tcs=False, + tcs_conf_path='/mnt/lustre/share_data/taochenxin/tcs/petreloss.conf', + test_mode=False, on_memory=False, local_rank=None, local_size=None, + with_blockwise_mask=False, ### !!! set to True, enable blockwise masking + blockwise_num_masking_patches=75, ### !!! 75 / 196 = 0.38 -> Modify this to increase mask ratio + input_size=224, patch_size=16, # no need to change now + max_mask_patches_per_block=None, # BEiT default setting, no need to change + min_mask_patches_per_block=16, # BEiT default setting, no need to change + fixed_num_masking_patches=True, ### set to true, fixed number of masking patch to blockwise_num_masking_patches for sim training + **kwargs): + super().__init__(image_set, data_path, transform=transform, use_tcs=use_tcs, + tcs_conf_path=tcs_conf_path, test_mode=test_mode, on_memory=on_memory, + local_rank=local_rank, local_size=local_size, **kwargs) + self.with_blockwise_mask = with_blockwise_mask + if with_blockwise_mask: + from .masking_generator import MaskingGenerator + window_size = input_size // patch_size + self.masked_position_generator = MaskingGenerator( + (window_size, window_size), + num_masking_patches=blockwise_num_masking_patches, + max_num_patches=max_mask_patches_per_block, + min_num_patches=min_mask_patches_per_block, + fixed_num_masking_patches=fixed_num_masking_patches + ) + + def __getitem__(self, index): + path = self.images[index].as_py() + target = self.classes[index].as_py() + sample = self._load_image(path) + if self.transform is not None: + sample = self.transform(sample) + if self.with_blockwise_mask: + return sample, target, self.masked_position_generator() + return sample, target + + +if __name__ == '__main__': + transform = transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.RandomHorizontalFlip(0.5), + transforms.ToTensor(), + transforms.Normalize(IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD), + ]) + dataset = ImagenetTCSDataset( + 'val', + 's3://imagenet', + tcs_conf_path='./petreloss.conf', + transform=transform, + with_blockwise_mask=True, + blockwise_num_masking_patches=75) + for i, (sample, target, mask) in enumerate(dataset): + if i < 10: + print(mask.sum()) + print(mask) + else: + break