├── .gitignore ├── Arabic Image Captioning.ipynb ├── README.md ├── data ├── .gitignore ├── Flickr8k_text │ ├── CrowdFlowerAnnotations.txt │ ├── ExpertAnnotations.txt │ ├── Flickr8k.arabic.full.txt │ ├── Flickr8k.arabic.txt │ ├── Flickr8k.lemma.token.txt │ ├── Flickr8k.token.txt │ ├── Flickr_8k.devImages.txt │ ├── Flickr_8k.testImages.txt │ ├── Flickr_8k.trainImages.txt │ └── readme.txt └── README.md ├── images ├── image_captioning_example.png ├── seq2seq-image-captioning-arabic-2.png └── seq2seq-image-captioning-arabic.png ├── requirements.txt └── resources ├── .gitignore ├── README.md ├── arabic_preprocessing.py ├── bleu.py └── bleu_scorer.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | db.sqlite3 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # Environments 85 | .env 86 | .venv 87 | env/ 88 | venv/ 89 | ENV/ 90 | env.bak/ 91 | venv.bak/ 92 | 93 | # Spyder project settings 94 | .spyderproject 95 | .spyproject 96 | 97 | # Rope project settings 98 | .ropeproject 99 | 100 | # mkdocs documentation 101 | /site 102 | 103 | # mypy 104 | .mypy_cache/ 105 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Arabic-Image-Captioning 2 | Generate Arabic captions for images using Deep Learning 3 | 4 | Paper: [here](https://www.insticc.org/Primoris/Resources/PaperPdf.ashx?idPaper=88812) 5 | 6 | Dataset: [./data/Flickr8k_text/Flickr8k.arabic.full.txt](./data/Flickr8k_text/Flickr8k.arabic.full.txt) 7 | 8 | Presentation: [here](https://drive.google.com/file/d/1vt1LcE_0xEFHpQ95bLWLNWqrwZ9AbTS8/view?usp=sharing) 9 | 10 | ## Introduction 11 | Image Captioning refers to the art of describing the content of an image by computers. It is a well-known problem in CV and NLP. It has many applications, such as improved information retrieval, early childhood education, for visually impaired persons, for social media, and so on. Although remarkable work has been accomplished recently for English, and due to the lack of large and publicly available dataset, the progress on Arabic Image Captioning is still lagging. Therefore, we developed our own dataset based on Flickr8K. It can be found under **data/Flickr8k_text/** folder, named **Flickr8k.arabic.full.txt**. It has the exact same format as the original Flickr8K. 12 | 13 | ## Model 14 | Inspired by recent advances in neural machine translation, the sequence-to-sequence encoder-decoder approach was adopted here. 15 | ![seq2seq-image-captioning-arabic](https://user-images.githubusercontent.com/9033365/50055387-e3ab9980-0156-11e9-859f-dce71314777a.png) 16 | For mode details, please check the paper. 17 | 18 | ## Results 19 | Good example: 20 | ![good_examples](https://user-images.githubusercontent.com/9033365/50055400-181f5580-0157-11e9-8a00-1d7af672b49f.png) 21 |

22 | Bad example: 23 | ![bad_examples](https://user-images.githubusercontent.com/9033365/50055408-2a998f00-0157-11e9-9d63-2b40e46a78f7.png) 24 | 25 | Results show that developing language specific datasets and end-to-end models outperforms translating English generated captions to a destination language as the later may accumulate both models errors: image captioning and translation. 26 | ![6](https://user-images.githubusercontent.com/9033365/76162680-71f3ad00-6159-11ea-9b19-e8957435336b.PNG) 27 | 28 | ## Installation 29 | 1. Clone or download this repository. 30 | 31 | 2. Make sure python 3.x is installed on your PC. To check if and which version is installed, run the following command: 32 | ``` 33 | python -V 34 | ``` 35 | If this results an error, this means that python isn’t installed on your PC! please download and install it from [the original website](https://www.python.org/) 36 | 37 | 3. (optional) it is recommended that you create a python virtual environment and install the necessary libraries in it to prevent versions collisions: 38 | ``` 39 | python -m venv AIC 40 | ``` 41 | where AIC is the environment name. Once you’ve created a virtual environment, you may activate it. 42 | ``` 43 | AIC\Scripts\activate.bat 44 | ``` 45 | 46 | 4. Install required libraries from the provided file (**requirements.txt**): 47 | ``` 48 | pip install -r requirements.txt 49 | ``` 50 | Make sure you provide the correct path of **requirements.txt** 51 | 52 | 5. Open jupyter notebook: 53 | ``` 54 | AIC\Scripts\jupyter-notebook.exe 55 | ``` 56 | then navigate to and open [Arabic Image Captioning.ipynb](./Arabic%20Image%20Captioning.ipynb) 57 | 58 | 59 | ## Citation 60 | Please cite [this paper](https://www.insticc.org/Primoris/Resources/PaperPdf.ashx?idPaper=88812): 61 | 62 | ``` 63 | @conference{visapp20, 64 | author={Obeida ElJundi. and Mohamad Dhaybi. and Kotaiba Mokadam. and Hazem Hajj. and Daniel Asmar.}, 65 | title={Resources and End-to-End Neural Network Models for Arabic Image Captioning}, 66 | booktitle={Proceedings of the 15th International Joint Conference on Computer Vision, Imaging and Computer Graphics Theory and Applications - Volume 5: VISAPP,}, 67 | year={2020}, 68 | pages={233-241}, 69 | publisher={SciTePress}, 70 | organization={INSTICC}, 71 | doi={10.5220/0008881202330241}, 72 | isbn={978-989-758-402-2}, 73 | } 74 | ``` 75 | 76 | ## Contact information 77 | For help, issues, or personal communication related to this work, please contact Obeida ElJundi: [oae15@mail.aub.edu](mailto:oae15@mail.aub.edu) 78 | -------------------------------------------------------------------------------- /data/.gitignore: -------------------------------------------------------------------------------- 1 | Flicker8k_Dataset/ 2 | -------------------------------------------------------------------------------- /data/Flickr8k_text/Flickr_8k.devImages.txt: -------------------------------------------------------------------------------- 1 | 2090545563_a4e66ec76b.jpg 2 | 3393035454_2d2370ffd4.jpg 3 | 3695064885_a6922f06b2.jpg 4 | 1679557684_50a206e4a9.jpg 5 | 3582685410_05315a15b8.jpg 6 | 1579798212_d30844b4c5.jpg 7 | 269650644_059a84ece5.jpg 8 | 2596619849_7b635dd310.jpg 9 | 2635164923_2a774f7854.jpg 10 | 3583321426_f373c52161.jpg 11 | 2735792721_b8fe85e803.jpg 12 | 3484841598_e26ee96aab.jpg 13 | 2490687446_9d46fdf5a9.jpg 14 | 2987328689_96a2d814f1.jpg 15 | 2992614450_b5a6692239.jpg 16 | 2391812384_7429b5e567.jpg 17 | 3665179773_dd217416fc.jpg 18 | 3515904775_f8acc5909e.jpg 19 | 3616808182_fb4eaec778.jpg 20 | 3652150541_8fb5a3a5d1.jpg 21 | 3693961165_9d6c333d5b.jpg 22 | 2895700779_fac1d9d278.jpg 23 | 2474092890_6c0781a8ed.jpg 24 | 3420469425_2980b4cd30.jpg 25 | 537222436_ab406234ce.jpg 26 | 3419634480_c390f62a6e.jpg 27 | 2659183350_730951f740.jpg 28 | 1178705300_c224d9a4f1.jpg 29 | 989851184_9ef368e520.jpg 30 | 535123126_c06c1ab9bf.jpg 31 | 3226541300_6c81711e8e.jpg 32 | 3457784061_8f77f43a9c.jpg 33 | 3364715316_df8c20bac1.jpg 34 | 233361142_d9d5f0cae9.jpg 35 | 634891010_9fa189effb.jpg 36 | 2977379863_2e8d7a104e.jpg 37 | 3663951804_868982f3f9.jpg 38 | 3170802797_3c851bb475.jpg 39 | 2409597310_958f5d8aff.jpg 40 | 2384550175_e421d3a871.jpg 41 | 2786245676_0a69543832.jpg 42 | 3346918203_986dca6641.jpg 43 | 2597958208_e03aa149c9.jpg 44 | 3710520638_866d542a80.jpg 45 | 3435015880_eda46ff50f.jpg 46 | 391324644_d23fdf06cb.jpg 47 | 2381613738_d8d2012e3c.jpg 48 | 411175971_0fffd3b8c6.jpg 49 | 2475300106_b8563111ba.jpg 50 | 2752923489_d3bceebacb.jpg 51 | 3294952558_96bb8c8cf3.jpg 52 | 3286543624_7a327f79ae.jpg 53 | 1440024115_129212c988.jpg 54 | 111497985_38e9f88856.jpg 55 | 3512127856_18a4c7aace.jpg 56 | 3158327361_6f1a518228.jpg 57 | 3570800810_978c993133.jpg 58 | 2402793046_3385554e81.jpg 59 | 3197791645_601908f26b.jpg 60 | 3523819210_99782628fc.jpg 61 | 3183875944_b2be694e06.jpg 62 | 3161044966_27bf6f9dec.jpg 63 | 3209966887_5b744bd050.jpg 64 | 3535768334_a3924bcccd.jpg 65 | 3461110860_37ef15af8e.jpg 66 | 2863027424_9c75105660.jpg 67 | 396763804_3b7f1e12a8.jpg 68 | 3193511842_82549c21fb.jpg 69 | 2800990525_a1f8427272.jpg 70 | 3437034427_6df5e9fbf9.jpg 71 | 2885891981_6b02620ae9.jpg 72 | 369186134_5eef374112.jpg 73 | 3365602213_dd3287a633.jpg 74 | 3229913073_e7857a5966.jpg 75 | 2664103423_c539f61016.jpg 76 | 3240558825_cd859d6230.jpg 77 | 1680126311_b92a2e8e72.jpg 78 | 2578289278_01516d23a0.jpg 79 | 255741044_1102982213.jpg 80 | 255266148_7ba7df1a88.jpg 81 | 2890075175_4bd32b201a.jpg 82 | 3044359043_627488ddf0.jpg 83 | 2273799395_5072a5736d.jpg 84 | 2934628301_41ea2e6cf9.jpg 85 | 3319177177_130a72b8ae.jpg 86 | 427936315_0b8f7b8d23.jpg 87 | 443430496_3fea95a07d.jpg 88 | 2300229745_af7a20c959.jpg 89 | 3265162450_5b4e3c5f1b.jpg 90 | 1874617189_e85d3f4326.jpg 91 | 3532782283_341f0381a3.jpg 92 | 3396251819_1efa69310f.jpg 93 | 1387443857_602ab6f9bf.jpg 94 | 345785626_9fa59f38ce.jpg 95 | 2100735137_05c6079537.jpg 96 | 3631810528_7233c0f421.jpg 97 | 539801139_7258ee437f.jpg 98 | 465994762_1760e83c5d.jpg 99 | 2190137367_746335f707.jpg 100 | 3618504267_d7eaa495d0.jpg 101 | 2736508369_fd9ff0b42f.jpg 102 | 427557693_1108566fd2.jpg 103 | 2874876837_80d178ba9b.jpg 104 | 1731546544_9fbf14617b.jpg 105 | 3091580843_178042c50b.jpg 106 | 2642688531_8fb68b2147.jpg 107 | 470887781_faae5dae83.jpg 108 | 2420696992_22e0dd467d.jpg 109 | 3005126574_49c28ffbee.jpg 110 | 1164131282_b30926f332.jpg 111 | 2170187328_65c2f11891.jpg 112 | 1468389504_c724bdcad0.jpg 113 | 3115901702_f07aa0ef74.jpg 114 | 3459871361_92d1ecda36.jpg 115 | 1022454332_6af2c1449a.jpg 116 | 127450902_533ceeddfc.jpg 117 | 3608752424_01a1cfd8a6.jpg 118 | 2290330500_e7bdaa58e1.jpg 119 | 309049466_1d7e7d5fc2.jpg 120 | 3367053761_8ec5834bf3.jpg 121 | 2943334864_6bab479a3e.jpg 122 | 2203615439_3c7cdc39dc.jpg 123 | 3043904009_3b5e0412cd.jpg 124 | 3172280520_e7655fb596.jpg 125 | 2950637275_98f1e30cca.jpg 126 | 3287969199_08e775d896.jpg 127 | 3223973114_6c15538ce9.jpg 128 | 3481859121_3d3e566ec0.jpg 129 | 2366643786_9c9a830db8.jpg 130 | 3540416139_c884f38351.jpg 131 | 3549140234_e99b07c739.jpg 132 | 1420060118_aed262d606.jpg 133 | 560278886_df4bd2e212.jpg 134 | 3004287781_c041c09c16.jpg 135 | 3215108916_0473007b47.jpg 136 | 3421706363_a3e22a4908.jpg 137 | 97105139_fae46fe8ef.jpg 138 | 3198247669_7493af04a7.jpg 139 | 2318721455_80c6644441.jpg 140 | 2759089516_cbb993cb92.jpg 141 | 2405978603_6221b0c2e7.jpg 142 | 2293149170_38fb2257ea.jpg 143 | 3142055158_01b9e4caa4.jpg 144 | 2529205842_bdcb49d65b.jpg 145 | 3195147187_a073d59fa8.jpg 146 | 123997871_6a9ca987b1.jpg 147 | 1472249944_d887c3aeda.jpg 148 | 973827791_467d83986e.jpg 149 | 3163198309_bbfe504f0a.jpg 150 | 2225864432_48a24f49a4.jpg 151 | 2429212017_77fc107699.jpg 152 | 3047751696_78c2efe5e6.jpg 153 | 1378557186_4bd1da6834.jpg 154 | 3331009729_d3b14738e6.jpg 155 | 319870744_0e0138d205.jpg 156 | 2185793891_5a5e903ca6.jpg 157 | 2218907190_5f43bf5e4d.jpg 158 | 537579448_a7f92cef58.jpg 159 | 1984936420_3f3102132b.jpg 160 | 874665322_9ad05c4065.jpg 161 | 3165123595_8db9f918bf.jpg 162 | 2899276965_a20b839cfd.jpg 163 | 2158267555_db1d94e468.jpg 164 | 2481598514_05a65d1f72.jpg 165 | 3250076419_eb3de15063.jpg 166 | 947664583_7c63172366.jpg 167 | 3440952969_608eb5e42b.jpg 168 | 2502835694_4fe121bbea.jpg 169 | 300765528_8c8f709dda.jpg 170 | 2931254547_e97c6d0d63.jpg 171 | 782401952_5bc5d3413a.jpg 172 | 2589308405_e208b5e745.jpg 173 | 3222702477_34d2d24f1f.jpg 174 | 3488087117_2719647989.jpg 175 | 3604928725_58147c87cd.jpg 176 | 2814037463_74de97da86.jpg 177 | 241347664_4a3e7e5be7.jpg 178 | 572618443_647483ca82.jpg 179 | 282131366_5f9a39c43c.jpg 180 | 3012513414_86180c44cb.jpg 181 | 2574194729_1f099647ee.jpg 182 | 3563461991_de05537878.jpg 183 | 989754491_7e53fb4586.jpg 184 | 2701271123_6761bc5f26.jpg 185 | 3474985112_24ef46e82d.jpg 186 | 3553476195_fb3747d7c1.jpg 187 | 3215870337_c92a1a1b2f.jpg 188 | 274313927_404d0e94ab.jpg 189 | 2520909293_9bb7f7364e.jpg 190 | 3530342993_a4a1f0e516.jpg 191 | 3383037991_8f07784b81.jpg 192 | 501320769_31eea7b7ea.jpg 193 | 205682549_713aa6cd88.jpg 194 | 2505465055_f1e6cf9b76.jpg 195 | 911795495_342bb15b97.jpg 196 | 3621329299_6fb3f2935c.jpg 197 | 3541491057_61a49588d9.jpg 198 | 3691800116_6a7b315e46.jpg 199 | 313326614_b2adbe59e0.jpg 200 | 3730011701_5352e02286.jpg 201 | 3341961913_9a9b362f15.jpg 202 | 2198511848_311d8a8c2f.jpg 203 | 2623146491_b64698b875.jpg 204 | 2924884899_f512c84332.jpg 205 | 525887861_4cc7a1beca.jpg 206 | 2975118353_5af5a5df54.jpg 207 | 140526327_3cb984de09.jpg 208 | 2647394564_4843800cff.jpg 209 | 2752230113_b5dab6f0f1.jpg 210 | 3100442775_6e2659b973.jpg 211 | 267015208_d80b3eb94d.jpg 212 | 1991806812_065f747689.jpg 213 | 3079073247_97e88e2eb7.jpg 214 | 3703107969_175da4b276.jpg 215 | 2452686995_621878f561.jpg 216 | 1580671272_3e99d94305.jpg 217 | 2399551242_c62a46dd5f.jpg 218 | 214501174_6db1f4d69c.jpg 219 | 2052953131_30834196fb.jpg 220 | 454709143_9c513f095c.jpg 221 | 3101378069_f8caa14c0a.jpg 222 | 2441815792_43565b1312.jpg 223 | 441212506_fcc321ac28.jpg 224 | 241347300_7c84ecf764.jpg 225 | 3751594676_edfbfa0688.jpg 226 | 2556392380_ee57514233.jpg 227 | 3335692531_dd4a995f91.jpg 228 | 3427540832_c882fded1d.jpg 229 | 3205839744_24504ba179.jpg 230 | 3625519177_4c2bb9e7f0.jpg 231 | 244760289_f4467b2b67.jpg 232 | 3477369101_8e0c61d8f4.jpg 233 | 2374247382_023a86b9ca.jpg 234 | 2312746782_4528a5b818.jpg 235 | 3231880001_193a579b97.jpg 236 | 3656225270_cdf89e3240.jpg 237 | 2106772874_381824648b.jpg 238 | 3501936223_6122a13d27.jpg 239 | 911527312_f81ee36b97.jpg 240 | 3429351222_17ae744daf.jpg 241 | 395461421_c586b136de.jpg 242 | 3514297698_0512623955.jpg 243 | 2060031241_a3ae7a06bb.jpg 244 | 2737233999_34d60dc5c3.jpg 245 | 2542415282_9240e1b5fc.jpg 246 | 3249062399_0dafe5e4f5.jpg 247 | 2061927950_dafba5b8a3.jpg 248 | 191003283_992257f835.jpg 249 | 2399219552_bbba0a9a59.jpg 250 | 1476241331_2f43b67aed.jpg 251 | 2826574228_c63009e473.jpg 252 | 2858759108_6e697c5f3e.jpg 253 | 393958545_48c17c66d1.jpg 254 | 2934801096_230ae78d7e.jpg 255 | 2481367956_8577d2fa98.jpg 256 | 1501297480_8db52c15b0.jpg 257 | 2914800692_0c512d27b8.jpg 258 | 3286761458_34af7e4499.jpg 259 | 3541483943_9776baee7c.jpg 260 | 2842439618_fb20fe2215.jpg 261 | 146098876_0d99d7fb98.jpg 262 | 3398788809_25c71ba018.jpg 263 | 3710050559_f6f12760fe.jpg 264 | 2695093520_5cfeb0729d.jpg 265 | 3697456750_460aea7252.jpg 266 | 3548191125_514f47e493.jpg 267 | 2902486045_6298eb22ef.jpg 268 | 2431120202_b24fe2333a.jpg 269 | 3211210739_3dea005fde.jpg 270 | 466176275_f40d37851e.jpg 271 | 2009636597_e3f4fe19fb.jpg 272 | 3410899419_4f8dca6f3f.jpg 273 | 2629346153_155ba73ae9.jpg 274 | 3495349745_1b29a63571.jpg 275 | 1077546505_a4f6c4daa9.jpg 276 | 3314180199_2121e80368.jpg 277 | 2765747519_2b851e01d6.jpg 278 | 145721498_a27d2db576.jpg 279 | 525538142_7348f0bce7.jpg 280 | 2483792149_a9b4ffecec.jpg 281 | 2630806789_6835bbae95.jpg 282 | 2428094795_d3a8f46046.jpg 283 | 2296166785_292a4e9f4c.jpg 284 | 3207343907_995f7ac1d2.jpg 285 | 441398149_297146e38d.jpg 286 | 3313620862_0c65c645f5.jpg 287 | 664341930_bd5c8b60ea.jpg 288 | 463875230_f19e83d6df.jpg 289 | 2485467050_1d5e2696d4.jpg 290 | 2515247156_c1b759fc33.jpg 291 | 3677964239_6406ed096f.jpg 292 | 3247693965_845b3b4349.jpg 293 | 416992999_654a99a903.jpg 294 | 3496028495_431cfdc042.jpg 295 | 2613889835_6f50a3b83b.jpg 296 | 435739506_2daf7f4887.jpg 297 | 2501742763_b2cb322087.jpg 298 | 2907073768_08fd7bdf60.jpg 299 | 2978810122_183e60ff2d.jpg 300 | 3700004668_99c3e3f55b.jpg 301 | 2737759676_4bc9be2daf.jpg 302 | 3181409177_edb09c2718.jpg 303 | 103106960_e8a41d64f8.jpg 304 | 540338917_57069687be.jpg 305 | 1295698260_e10c53c137.jpg 306 | 460478198_83039f2593.jpg 307 | 252124738_796599e94b.jpg 308 | 246231741_882b45c4e1.jpg 309 | 3519815055_304dc8e8d6.jpg 310 | 3537920947_6c5a956f47.jpg 311 | 2972864304_481aeffe50.jpg 312 | 3502897880_8392d0e4de.jpg 313 | 1131155939_b4b457b05e.jpg 314 | 2874984466_1aafec2c9f.jpg 315 | 421316045_ae7a1eb4bc.jpg 316 | 3720210639_18bb34e475.jpg 317 | 3522349685_f046f0e250.jpg 318 | 459778335_857d8ffebf.jpg 319 | 3330935489_9cb67ca36b.jpg 320 | 3590753142_61993d39df.jpg 321 | 1459250022_bf1eddad11.jpg 322 | 3371533654_73a12a35a4.jpg 323 | 2675397335_1dcdbd12f5.jpg 324 | 802594049_289e3c8420.jpg 325 | 576920249_df1bdc2068.jpg 326 | 756521713_5d3da56a54.jpg 327 | 3560125106_691c292893.jpg 328 | 2540203582_9a9ac92a5d.jpg 329 | 3455405300_aa3069ecaa.jpg 330 | 2187720319_112d00f07d.jpg 331 | 3346040664_5b584e6133.jpg 332 | 3030079705_0dee8a3e89.jpg 333 | 2775249812_f4db95e818.jpg 334 | 3711826708_bba64fb1e1.jpg 335 | 3401902253_cd27e6d0fe.jpg 336 | 2537583012_4a358a6a8a.jpg 337 | 2648310638_d6c576b5e4.jpg 338 | 2670637584_d96efb8afa.jpg 339 | 3213395965_2a823c6865.jpg 340 | 3088922727_4bdf2ccc94.jpg 341 | 3215896272_e9b4b547a9.jpg 342 | 2434006663_207a284cec.jpg 343 | 3373544964_c9f1253b7d.jpg 344 | 3126752627_dc2d6674da.jpg 345 | 3514278386_de2343577e.jpg 346 | 2201192417_d934730fea.jpg 347 | 3386953179_84c2d7922f.jpg 348 | 2734669176_c272b42597.jpg 349 | 607339469_af851c4119.jpg 350 | 2500567791_101d5ddee3.jpg 351 | 3689975998_72f50b6d91.jpg 352 | 2081679622_6f1442367d.jpg 353 | 2726262796_03bd63a155.jpg 354 | 2898304260_a4099a193a.jpg 355 | 3223709894_97824ba76f.jpg 356 | 2204695848_3d1b140212.jpg 357 | 3355683198_715fb1a2ac.jpg 358 | 3630991662_990f397f7c.jpg 359 | 2600386812_8790879d9a.jpg 360 | 2908466042_bf07cb52c7.jpg 361 | 2773682293_3b712e47ff.jpg 362 | 640203018_c0e7175831.jpg 363 | 107582366_d86f2d3347.jpg 364 | 3319899418_4bcf1b00d8.jpg 365 | 823675317_b5fbdb17b3.jpg 366 | 294098577_c10f32bcfa.jpg 367 | 3240351042_5d29c94b0e.jpg 368 | 1980882959_9a161f3469.jpg 369 | 3631023049_8a85bab19f.jpg 370 | 3278581900_8ce75a5332.jpg 371 | 3175712926_5a470d0886.jpg 372 | 2123932281_1a4fd38455.jpg 373 | 1138784872_69ade3f2ab.jpg 374 | 2752919987_8bfca604ab.jpg 375 | 1802092493_7b44fdb6b9.jpg 376 | 2661138991_d55aa0e5dc.jpg 377 | 3665169936_01ae94c9fd.jpg 378 | 3458625738_297857369c.jpg 379 | 2458033289_f0616879df.jpg 380 | 511749704_3037806cb1.jpg 381 | 2623496164_68ffeb5067.jpg 382 | 2141713971_e25eb12712.jpg 383 | 3271385712_ffd34f2de5.jpg 384 | 2053733930_e245615ad4.jpg 385 | 1801663973_5ad393caeb.jpg 386 | 3557324238_6ba58831d9.jpg 387 | 3357708906_fb3a54dd78.jpg 388 | 2987121689_f9de6c479b.jpg 389 | 2813784259_d201044d71.jpg 390 | 1077931201_1e0bb83105.jpg 391 | 1999444757_1b92efb590.jpg 392 | 2710563762_06d48329d7.jpg 393 | 1926129518_4350f4f552.jpg 394 | 3394654132_9a8659605c.jpg 395 | 693164706_9624582e69.jpg 396 | 2165461920_1a4144eb2b.jpg 397 | 3472485022_5d03e9852d.jpg 398 | 2210368267_0615754b48.jpg 399 | 2362481035_a7600875d0.jpg 400 | 3690425778_3b390b3ea5.jpg 401 | 2679565682_91ecd283ff.jpg 402 | 405534893_2d0f3b0147.jpg 403 | 2467853482_17009933e8.jpg 404 | 475317104_1cdc1653b4.jpg 405 | 2505056124_1276e8dbcb.jpg 406 | 3075068274_2a28a5263b.jpg 407 | 862177617_c2c0581075.jpg 408 | 1691573772_1adef8e40e.jpg 409 | 2579266054_1ec58aa92f.jpg 410 | 505944126_f9a6ab8944.jpg 411 | 3176968956_d942a93513.jpg 412 | 2596474836_79468f23a0.jpg 413 | 3203878596_cbb307ce3b.jpg 414 | 3673484638_dce87295fe.jpg 415 | 2346402952_e47d0065b6.jpg 416 | 719837187_3e7bf1d472.jpg 417 | 3163068926_d28ed3ef53.jpg 418 | 3644941648_012ec87848.jpg 419 | 3448490813_f9623e864d.jpg 420 | 3724581378_41049da264.jpg 421 | 1034276567_49bb87c51c.jpg 422 | 3421480658_b3518b6819.jpg 423 | 2618538137_44fffe10c4.jpg 424 | 3486538055_bcf4d3dfda.jpg 425 | 519167484_ee03e2a91e.jpg 426 | 2282522980_45cfa8e0cf.jpg 427 | 3711611500_ea47b58b6f.jpg 428 | 2057160636_6e9cf3b5f0.jpg 429 | 260392825_ea61660633.jpg 430 | 541046380_513e295384.jpg 431 | 1396064003_3fd949c9dd.jpg 432 | 3702038926_966fdaa311.jpg 433 | 2598012140_832863fcb9.jpg 434 | 3468023754_8a07d4c56e.jpg 435 | 309771854_952aabe3cc.jpg 436 | 2937461473_11bbace28c.jpg 437 | 247617035_9f2e821534.jpg 438 | 2833431496_09d999db4d.jpg 439 | 3549277110_24d4064ccd.jpg 440 | 3116011063_f4071ccce6.jpg 441 | 2403376030_903521c371.jpg 442 | 2090997177_76d482b158.jpg 443 | 3517023411_a8fbd15230.jpg 444 | 3328535573_33c3cd5b59.jpg 445 | 632251903_b36701a5e9.jpg 446 | 1426014905_da60d72957.jpg 447 | 3262849619_0bc4f88ef9.jpg 448 | 3478877323_0a507a601b.jpg 449 | 3154152744_4e93ec8a62.jpg 450 | 2090339522_d30d2436f9.jpg 451 | 2552438538_285a05b86c.jpg 452 | 2687672606_275169c35d.jpg 453 | 2574509968_e4692ae169.jpg 454 | 3262301835_9f1a49b80a.jpg 455 | 3342271377_446ffc34c0.jpg 456 | 262446581_06ef7d9445.jpg 457 | 2090387793_274ab4cf7d.jpg 458 | 3046190891_05c6ecd9b6.jpg 459 | 3716272233_7845ec5b3e.jpg 460 | 3009035153_715e39b440.jpg 461 | 862156271_3eacea90a8.jpg 462 | 2356574282_5078f08b58.jpg 463 | 519228867_2fd25e38d4.jpg 464 | 3585123310_9a8e94bd2b.jpg 465 | 3331525712_af1dcc47f2.jpg 466 | 3205214191_29b42b9b09.jpg 467 | 2286823363_7d554ea740.jpg 468 | 3484906808_ee20714408.jpg 469 | 3507670136_2e5f94accf.jpg 470 | 244399048_8332bb3270.jpg 471 | 3209620285_edfc479392.jpg 472 | 385835044_4aa11f6990.jpg 473 | 2944025729_5aecda30ee.jpg 474 | 501699433_f8df386cf9.jpg 475 | 3323076458_3ce72a1dae.jpg 476 | 3684562647_28dc325522.jpg 477 | 483039719_75181b2726.jpg 478 | 203114209_e4cd71a6b7.jpg 479 | 2165677531_e1d5e086f7.jpg 480 | 3532098999_4e07a0a17e.jpg 481 | 1370773415_967b1ffde1.jpg 482 | 3242088278_43eea5d17e.jpg 483 | 3421547427_53411b6278.jpg 484 | 3206919175_e3a11b6874.jpg 485 | 2709359730_13bca100af.jpg 486 | 2115620856_4fa5025ac6.jpg 487 | 3046431231_dc48851062.jpg 488 | 2346772831_b2748ba1f0.jpg 489 | 3259110412_9908c45144.jpg 490 | 1248357227_2b4175fc39.jpg 491 | 2480668859_6f9b46be6a.jpg 492 | 3175434849_859f09fe07.jpg 493 | 3053813297_7ce5f87710.jpg 494 | 2424111022_4e332b8aee.jpg 495 | 3019986034_7453777274.jpg 496 | 1570723692_3a2b064d43.jpg 497 | 3623650392_7b75d4de21.jpg 498 | 3676460610_8c52e8a355.jpg 499 | 2302516347_26054442f9.jpg 500 | 3457604528_302396c08c.jpg 501 | 241347356_8a515555fd.jpg 502 | 3243094580_ccd01679f5.jpg 503 | 3273489163_8209545810.jpg 504 | 3488837187_0c7264a16c.jpg 505 | 290019324_23582048d4.jpg 506 | 2393196444_8f4f540f5f.jpg 507 | 1425919702_ddb761aeec.jpg 508 | 3504275465_604ce2ef34.jpg 509 | 1410193619_13fff6c875.jpg 510 | 3393446245_37dd3f3b59.jpg 511 | 2883907436_82bf4a36b8.jpg 512 | 3191027142_33e86636ca.jpg 513 | 1056249424_ef2a2e041c.jpg 514 | 143552829_72b6ba49d4.jpg 515 | 2135502491_a15c6b5eae.jpg 516 | 3438981089_2ef1a6353c.jpg 517 | 2667549961_57e5e2c0a5.jpg 518 | 3396275223_ee080df8b5.jpg 519 | 2714674623_8cd05ac114.jpg 520 | 3504158556_1d410c8ff7.jpg 521 | 3672944692_8d24a44fc6.jpg 522 | 3599442049_e448c7c9b2.jpg 523 | 2431723485_bc6b8e6418.jpg 524 | 2339573065_91f1e3be60.jpg 525 | 2831723637_30d4456665.jpg 526 | 1332823164_c70a5d930e.jpg 527 | 3423509305_e399d005db.jpg 528 | 3231596071_f0c522a639.jpg 529 | 2248487956_2603f55ab9.jpg 530 | 3572144280_ea42bbd927.jpg 531 | 3432634159_1eb9a73306.jpg 532 | 3184031654_34b5c4ffe1.jpg 533 | 2061944672_0383e65c8a.jpg 534 | 2838619742_eed855d8a8.jpg 535 | 587604325_af5d6df679.jpg 536 | 3539840291_1c3eed701d.jpg 537 | 464506846_1734302b58.jpg 538 | 3517040752_debec03376.jpg 539 | 3522025527_c10e6ebd26.jpg 540 | 2866093652_aa717eb9ce.jpg 541 | 3365198533_539073002b.jpg 542 | 2772084628_c0ae29d87a.jpg 543 | 2976684095_ce7ccfd423.jpg 544 | 1745110280_0cbff5e273.jpg 545 | 2909081008_9a7bfc599a.jpg 546 | 3552206648_123bf4ac82.jpg 547 | 3326588088_172d1b2584.jpg 548 | 3247500085_c4f641aa84.jpg 549 | 2194797921_96af7a9467.jpg 550 | 2460159430_71ab1aacfa.jpg 551 | 3400041870_4e7732b40f.jpg 552 | 862187579_9faf4a51e0.jpg 553 | 3513362553_5fc5779e20.jpg 554 | 3255017708_2b02bfcdcf.jpg 555 | 3635991166_f95304af0a.jpg 556 | 2097403787_77a154f5b9.jpg 557 | 3328495660_ed0e3f29cf.jpg 558 | 3540598210_972f0ff573.jpg 559 | 3174156702_95a1cda2d9.jpg 560 | 2517284816_9b8fd3c6b6.jpg 561 | 3520869880_2e8b7d7842.jpg 562 | 3590647207_2d4ec3f52c.jpg 563 | 1306145560_1e37081b91.jpg 564 | 481887827_f8975dabf1.jpg 565 | 756004341_1a816df714.jpg 566 | 2993167197_e5d0a73530.jpg 567 | 424307754_1e2f44d265.jpg 568 | 326028454_fb396167e6.jpg 569 | 210126070_0d43b300b9.jpg 570 | 2921670682_6a77a6c3e9.jpg 571 | 804087017_330bcc8c56.jpg 572 | 3399616238_77acf4ee12.jpg 573 | 3446586125_cafa0bfd67.jpg 574 | 236144859_52f9e38885.jpg 575 | 3209523192_05a4cef844.jpg 576 | 2218843713_cf28ea319e.jpg 577 | 1346051107_9cdc14e070.jpg 578 | 134724228_30408cd77f.jpg 579 | 135235570_5698072cd4.jpg 580 | 2887750774_920eb171aa.jpg 581 | 251792066_b5233b3d86.jpg 582 | 3057618932_3b80ae85de.jpg 583 | 688940111_325a74674a.jpg 584 | 2192333873_2a0cbe849d.jpg 585 | 3240014971_ee2ea8406f.jpg 586 | 1089755335_0bfbfd30e6.jpg 587 | 2308256827_3c0a7d514d.jpg 588 | 3330675488_8692476a4a.jpg 589 | 3463268965_f22884fc69.jpg 590 | 3590739067_58baffb3a7.jpg 591 | 3189521080_133777bce5.jpg 592 | 2404520067_87798dbaee.jpg 593 | 425518464_a18b87c563.jpg 594 | 482882307_7dcb9eee11.jpg 595 | 90011335_cfdf9674c2.jpg 596 | 3211199368_ca78387f72.jpg 597 | 493542985_c85ad29ebe.jpg 598 | 2647062476_5ef31ba867.jpg 599 | 3225226381_9fe306fb9e.jpg 600 | 2920969723_83918fe909.jpg 601 | 136644885_f7d2bbf546.jpg 602 | 2148991939_3b9fd6c439.jpg 603 | 2980445969_a86f4e6a0e.jpg 604 | 2887171449_f54a2b9f39.jpg 605 | 3441701164_6dbbdf1bce.jpg 606 | 410042380_517ccee020.jpg 607 | 3622929632_26fb800000.jpg 608 | 2884651479_12e400ee58.jpg 609 | 241346105_c1c860db0d.jpg 610 | 3269087421_1d489abeae.jpg 611 | 1088767354_2acee738cf.jpg 612 | 2939371251_f923569a72.jpg 613 | 3542425197_2ef81c6051.jpg 614 | 1501985304_8c50093004.jpg 615 | 1468962616_5803b4397f.jpg 616 | 186346360_541047336f.jpg 617 | 3457460673_800d7f7dd9.jpg 618 | 1377668044_36398401dd.jpg 619 | 3134387321_3a253224c1.jpg 620 | 772403830_08b72c7da9.jpg 621 | 3623302162_099f983d58.jpg 622 | 3447876218_4ccf42d7a0.jpg 623 | 476740978_45b65ebe0c.jpg 624 | 2455286250_fb6a66175a.jpg 625 | 3098336319_a7e5b061d0.jpg 626 | 3712574653_e009f76d19.jpg 627 | 2095444126_201ff9f222.jpg 628 | 2752341621_54490b9b09.jpg 629 | 3198962089_e647d1b0cd.jpg 630 | 2589156742_c46bc82137.jpg 631 | 97577988_65e2eae14a.jpg 632 | 2444741900_5cb3ef3e1d.jpg 633 | 775664534_3f6de7d413.jpg 634 | 2602083686_e8a1af69cf.jpg 635 | 3186863842_5832573c5e.jpg 636 | 2059616165_b7c99c1009.jpg 637 | 1510078253_96e9ec50e7.jpg 638 | 2169067981_cc19268f23.jpg 639 | 3335885203_a3fe8e541f.jpg 640 | 3244910944_612b8ce98f.jpg 641 | 3370308329_7f2de5bb58.jpg 642 | 2597308074_acacc12e1b.jpg 643 | 3520936130_9e90872560.jpg 644 | 3242007318_01e82171aa.jpg 645 | 2795287622_da187a3e86.jpg 646 | 2904997007_23d4b94101.jpg 647 | 390986651_c801db91a0.jpg 648 | 3159641529_c2c74f3eaf.jpg 649 | 2085557551_7a88d01d4e.jpg 650 | 3104690333_4314d979de.jpg 651 | 96978713_775d66a18d.jpg 652 | 2978409165_acc4f29a40.jpg 653 | 288508162_1727873924.jpg 654 | 3219122000_bd6b4ae5ff.jpg 655 | 3405011838_f81117c99f.jpg 656 | 2745811124_12c4426b8b.jpg 657 | 2364774105_fbaf0c191f.jpg 658 | 229954612_a4438297ee.jpg 659 | 3091962081_194f2f3bd4.jpg 660 | 2107838729_a527e434bd.jpg 661 | 3449718979_e987c64e2d.jpg 662 | 239453674_0df7767208.jpg 663 | 3265864834_e0229020dd.jpg 664 | 159712188_d530dd478c.jpg 665 | 3508522093_51f6d77f45.jpg 666 | 2354064281_10afa38206.jpg 667 | 3122579598_14841c038a.jpg 668 | 2356664078_4b1e6e465d.jpg 669 | 3439243433_d5f3508612.jpg 670 | 2461990494_c5ece064cc.jpg 671 | 745563422_f4fa7d9157.jpg 672 | 3662963630_8f097e38d4.jpg 673 | 3689727848_b53f931130.jpg 674 | 3288173388_03bc2a844d.jpg 675 | 3212465975_b657f40eed.jpg 676 | 2573667207_a1bf49befc.jpg 677 | 514905846_b54d13946a.jpg 678 | 3273969811_42e9fa8f63.jpg 679 | 3652764505_87139e71f8.jpg 680 | 599366440_a238e805cf.jpg 681 | 2288530008_4ebcee2174.jpg 682 | 3679407035_708774de34.jpg 683 | 2768662025_44001fe5d1.jpg 684 | 3704698586_a42c25d0c1.jpg 685 | 3261666285_86fceb762d.jpg 686 | 534886684_a6c9f40fa1.jpg 687 | 3182570190_48214e54c7.jpg 688 | 2222186636_85e03e0b75.jpg 689 | 3587596696_9c5964c94d.jpg 690 | 3608663656_9192a21eeb.jpg 691 | 368393384_86defdcde8.jpg 692 | 1526325728_74eb4153d8.jpg 693 | 3624676866_8f6d0efcc9.jpg 694 | 2307451605_22e9c06530.jpg 695 | 2913207978_9e9624e249.jpg 696 | 3294830188_e46bd9b93c.jpg 697 | 3550276904_19de3561c5.jpg 698 | 300577374_bfccb0430b.jpg 699 | 2092177624_13ab757e8b.jpg 700 | 3380519003_9f91d5a7fb.jpg 701 | 3375920709_ef7370fa09.jpg 702 | 1087539207_9f77ab3aaf.jpg 703 | 2868136205_3cf679208d.jpg 704 | 3436313241_6c73153fb6.jpg 705 | 2480021389_dda9fb2818.jpg 706 | 1663454406_5e2cf8c5bb.jpg 707 | 3287904625_f68ca5cea7.jpg 708 | 1045521051_108ebc19be.jpg 709 | 624058168_f1c5e87e59.jpg 710 | 2173061319_1f267765dc.jpg 711 | 462080147_ca088e6541.jpg 712 | 179009558_69be522c63.jpg 713 | 2872197070_4e97c3ccfa.jpg 714 | 3351418768_596ef7fd6f.jpg 715 | 1429546659_44cb09cbe2.jpg 716 | 2931950813_93145c4746.jpg 717 | 1303548017_47de590273.jpg 718 | 2579572274_826598b14a.jpg 719 | 3231575742_31732664cf.jpg 720 | 2344699642_4fae2f4e07.jpg 721 | 3455757720_7aeba57056.jpg 722 | 3585488964_1467945775.jpg 723 | 1470536919_1f3fd6c65a.jpg 724 | 2109370875_05241bdda7.jpg 725 | 2800934095_b84a5009dd.jpg 726 | 2815755985_0fa55544c0.jpg 727 | 2217328285_b1d55c17ca.jpg 728 | 2714220101_c31db50b10.jpg 729 | 3005124440_c096b310fb.jpg 730 | 224026428_0165164ceb.jpg 731 | 2646540383_343e1ec9a4.jpg 732 | 3560081723_62da0035bd.jpg 733 | 3132832452_c354c6396c.jpg 734 | 2178095150_436b035741.jpg 735 | 3037558954_20115165e3.jpg 736 | 3525403875_7f95e0cbfe.jpg 737 | 2097489021_ca1b9f5c3b.jpg 738 | 3330333217_1a69497a74.jpg 739 | 611910909_4f8e43e070.jpg 740 | 2637904605_fc355816fc.jpg 741 | 2551344688_17a12a6948.jpg 742 | 1130369873_d80a1aa59c.jpg 743 | 3286198467_8880be127e.jpg 744 | 3041645937_ff7591d134.jpg 745 | 2911552402_5166bc173b.jpg 746 | 241346923_18bd84bea4.jpg 747 | 3381161854_af8b05243c.jpg 748 | 2695962887_a1647c567b.jpg 749 | 3255732353_fbc487aefc.jpg 750 | 3545793128_af3af544dc.jpg 751 | 2891162278_fbf96be4f4.jpg 752 | 3583293892_c96af8cd98.jpg 753 | 2693539377_5442430f81.jpg 754 | 3044745642_1d0784ff29.jpg 755 | 1469000260_5d473c8283.jpg 756 | 3487131146_9d3aca387a.jpg 757 | 3524612244_64f00afec5.jpg 758 | 3265527323_6431f00692.jpg 759 | 3036971334_78187a9570.jpg 760 | 405537503_f66ecc5073.jpg 761 | 3222842866_cb85243ce4.jpg 762 | 3410902181_b2a3c6eec9.jpg 763 | 2832453252_a06f7826a8.jpg 764 | 3235746553_a40416c00e.jpg 765 | 93922153_8d831f7f01.jpg 766 | 3256272547_5ae6c66293.jpg 767 | 2621771656_09a620da6d.jpg 768 | 3393152604_27bd1037f2.jpg 769 | 2261550615_b6c25d987b.jpg 770 | 2936590102_25036069a6.jpg 771 | 3549673305_4dfd44e04a.jpg 772 | 3553225222_f5ebe44af1.jpg 773 | 3215081286_d55541aa6b.jpg 774 | 2710416789_555180e399.jpg 775 | 3718305988_fe2c91fd44.jpg 776 | 2406591500_403f145905.jpg 777 | 3415178926_909db9400b.jpg 778 | 2579899436_5086a33c7a.jpg 779 | 2199083344_3aa77f4879.jpg 780 | 3500139659_b2a60b0141.jpg 781 | 3686078365_9e655e238f.jpg 782 | 3419197575_aa5b84a9f0.jpg 783 | 3257182199_5fda78d870.jpg 784 | 3420278866_1d17c12713.jpg 785 | 339822505_be3ccbb71f.jpg 786 | 3711664623_ef87105ea7.jpg 787 | 2936707421_8e629874b8.jpg 788 | 289860281_94d699f36d.jpg 789 | 661749711_6f408dad62.jpg 790 | 247706586_7e25c7adf8.jpg 791 | 3322200641_c2e51ff37b.jpg 792 | 1350811702_2ce7cfd0c5.jpg 793 | 524310507_51220580de.jpg 794 | 3217291172_10ef70af88.jpg 795 | 2094323311_27d58b1513.jpg 796 | 957682378_46c3b07bcd.jpg 797 | 23445819_3a458716c1.jpg 798 | 3173461705_b5cdeef1eb.jpg 799 | 2402744031_11f9f2f2b8.jpg 800 | 3653484549_f316590b0f.jpg 801 | 438639005_208bc59b0b.jpg 802 | 442220883_ff3d6e507f.jpg 803 | 2833820456_143ea6ce47.jpg 804 | 3356748019_2251399314.jpg 805 | 2187503678_fd743e0a00.jpg 806 | 1319634306_816f21677f.jpg 807 | 1177994172_10d143cb8d.jpg 808 | 3174453534_fcc927c647.jpg 809 | 2543017787_9720b4fa1c.jpg 810 | 2865703567_52de2444f2.jpg 811 | 1579206585_5ca6a24db0.jpg 812 | 440190907_bf8b7ba8ef.jpg 813 | 3119913014_688d4997d7.jpg 814 | 3393394134_0caac47e1c.jpg 815 | 2836360729_6500249fe6.jpg 816 | 2249480913_e1695e5c28.jpg 817 | 2906802485_dfebf09173.jpg 818 | 2121140070_a09644550b.jpg 819 | 3016521240_2ef20834b6.jpg 820 | 3139895886_5a6d495b13.jpg 821 | 414773731_c3f5bf43d5.jpg 822 | 3191982761_88793192ed.jpg 823 | 661755629_602ea4cf09.jpg 824 | 3485657956_7481582565.jpg 825 | 3173157541_70b16b4318.jpg 826 | 3416339125_0860d3d1eb.jpg 827 | 397286183_745abbf40d.jpg 828 | 3576536763_3c8c4f232e.jpg 829 | 1528205014_1323aa9dfd.jpg 830 | 2647229826_e0e0c65ef1.jpg 831 | 3333017828_b930b9d41b.jpg 832 | 3089107423_81a24eaf18.jpg 833 | 3150315970_8f045c41a4.jpg 834 | 2986280913_13fb2d472e.jpg 835 | 3482879314_d3387e95b1.jpg 836 | 2493974889_50ae29f1e1.jpg 837 | 3470303255_fbb41b8dd0.jpg 838 | 3444684583_6656e38088.jpg 839 | 2303426046_09cfd7bc4e.jpg 840 | 3532200762_b28c39d311.jpg 841 | 515797344_4ae75cb9b1.jpg 842 | 241347391_4fcd4639f4.jpg 843 | 2976537455_f3988c2d46.jpg 844 | 3330102093_1d6e35e78d.jpg 845 | 3594566537_55bd712fdb.jpg 846 | 3146355833_1b7fc80210.jpg 847 | 2502354602_f4d6dcf42d.jpg 848 | 2394857899_76bfdf720b.jpg 849 | 2898810636_84fb5c0b63.jpg 850 | 3420338549_bd78d35243.jpg 851 | 3186556417_b2d6921a20.jpg 852 | 3415113018_7b95ddcd11.jpg 853 | 3461049169_e068ae4f25.jpg 854 | 2422482455_b98d9c2120.jpg 855 | 3176131893_7181c733aa.jpg 856 | 1355935187_2c99648138.jpg 857 | 2986716822_e220754d32.jpg 858 | 2448210587_9fe7ea5f42.jpg 859 | 3559374748_f18c7caa55.jpg 860 | 2525716531_e6dedee421.jpg 861 | 3155279929_d1cddbe7cf.jpg 862 | 3679502342_7fe6ef8a36.jpg 863 | 236730743_0d4fd8de5a.jpg 864 | 463786229_b54c9a3436.jpg 865 | 3234890865_bb3c316968.jpg 866 | 3103231330_db98b14501.jpg 867 | 2703155733_19ac6f97a8.jpg 868 | 3292277400_f95cdd13d1.jpg 869 | 2877424957_9beb1dc49a.jpg 870 | 3094568845_d0b56c5651.jpg 871 | 3293945284_6a04e477a9.jpg 872 | 3604496023_c1f546423e.jpg 873 | 3146937399_8c046b7b1a.jpg 874 | 3578372039_57473f473c.jpg 875 | 2734219983_fe86a60bf9.jpg 876 | 413231421_43833a11f5.jpg 877 | 3443703471_14845d8850.jpg 878 | 2417745327_a2c2705043.jpg 879 | 2502935765_a0ae1fa7be.jpg 880 | 1032122270_ea6f0beedb.jpg 881 | 3404906655_bc51c69c1e.jpg 882 | 3005872315_e6771763bd.jpg 883 | 2987775031_3f9ac69319.jpg 884 | 2942311160_a154104c62.jpg 885 | 2481003841_06086eafc2.jpg 886 | 2269795781_46a296aa21.jpg 887 | 141755292_7a0b3364cf.jpg 888 | 2574230252_f5a1382dd4.jpg 889 | 3555573680_41c1540a86.jpg 890 | 3214381315_b54f5c9be4.jpg 891 | 490390951_87395fcb1c.jpg 892 | 3529314899_b4e533bb76.jpg 893 | 2099323664_bb20457f26.jpg 894 | 404850242_3a55a4c874.jpg 895 | 3134341610_3c55e373a7.jpg 896 | 1232148178_4f45cc3284.jpg 897 | 618771382_459bb492e4.jpg 898 | 3266261886_36e1323d2f.jpg 899 | 566384456_97da3c7bd6.jpg 900 | 124972799_de706b6d0b.jpg 901 | 3441145615_b4fcd9eea0.jpg 902 | 3306464579_1b16a0caf2.jpg 903 | 3112635165_2d614d7c1a.jpg 904 | 3563673070_71fa0903ed.jpg 905 | 3425918361_3b890d9575.jpg 906 | 2275253272_00f941366e.jpg 907 | 3192311620_99bda27fbd.jpg 908 | 2736902411_a0010f89ae.jpg 909 | 2602306033_2b3100d36b.jpg 910 | 415118186_64defc96f3.jpg 911 | 2266144051_614b2d62b0.jpg 912 | 244870123_dcb6e53643.jpg 913 | 3482787182_a5c6d4b386.jpg 914 | 3288174272_2daa06d360.jpg 915 | 3064097919_e536ab9693.jpg 916 | 2100046085_69b59b6645.jpg 917 | 3226796100_08c49cfa5c.jpg 918 | 3601978895_9fec23ce0c.jpg 919 | 3029043380_b28644ea5d.jpg 920 | 2038662925_f4fa8c2534.jpg 921 | 397815951_3b02090324.jpg 922 | 3218861747_5c5c547b66.jpg 923 | 424379231_23f1ade134.jpg 924 | 225699652_53f6fb33cd.jpg 925 | 3375014075_157388f8a9.jpg 926 | 2869009633_ea3cafd437.jpg 927 | 3561433412_3985208d53.jpg 928 | 381514859_b40418d9c3.jpg 929 | 3420284416_a90af1fb7a.jpg 930 | 2642474867_4e6346f809.jpg 931 | 3436259762_43709321ff.jpg 932 | 619169586_0a13ee7c21.jpg 933 | 3516285214_59823b341e.jpg 934 | 3694219419_a7a83d4886.jpg 935 | 263850317_5bb3a18a08.jpg 936 | 3722572342_6904d11d52.jpg 937 | 3425685827_03683e8e5a.jpg 938 | 3342272425_804316cb3d.jpg 939 | 166433861_70b66cd381.jpg 940 | 3187924573_203223e6c0.jpg 941 | 3480052428_c034b98a08.jpg 942 | 2890057168_c712f932e0.jpg 943 | 2450486758_a66fd296ea.jpg 944 | 295729735_8360f2e64c.jpg 945 | 3403263046_3cc701a07a.jpg 946 | 261883591_3f2bca823c.jpg 947 | 3504940491_94c43792ed.jpg 948 | 3470129475_9e58b6742c.jpg 949 | 3646820231_2abc736840.jpg 950 | 3613175012_bcd063e7c9.jpg 951 | 2140305708_591d10b54d.jpg 952 | 2193980605_4221c6474d.jpg 953 | 3170110692_d1e0e66cee.jpg 954 | 2983555530_a89f1f5ed7.jpg 955 | 2142232919_c857a09dd7.jpg 956 | 3077781040_bc27778609.jpg 957 | 3149804151_1cc8d10783.jpg 958 | 2905975229_7c37156dbe.jpg 959 | 27782020_4dab210360.jpg 960 | 232874193_c691df882d.jpg 961 | 3294179574_4f67e67d6f.jpg 962 | 2449446913_28fa5b7c75.jpg 963 | 3681414069_71ba164f71.jpg 964 | 3369258147_03db257f0f.jpg 965 | 1215334959_b1970965f7.jpg 966 | 1100214449_d10861e633.jpg 967 | 1478268555_7e301fc510.jpg 968 | 3232252882_05db7c2216.jpg 969 | 3033612929_764d977bd5.jpg 970 | 1388970365_162edcceb4.jpg 971 | 3445544288_68fdb25969.jpg 972 | 3401647850_685c03ffff.jpg 973 | 3482859574_3908de3427.jpg 974 | 497122685_a51b29dc46.jpg 975 | 3025495499_b15797b452.jpg 976 | 278007543_99f5a91a3e.jpg 977 | 621000329_84f48948eb.jpg 978 | 3094278545_febac56382.jpg 979 | 3568225554_73cdb19576.jpg 980 | 3495453699_1c9faedf3c.jpg 981 | 457945610_1a23b9ced0.jpg 982 | 3334300164_e75e0479ae.jpg 983 | 656260720_a7db4ce48b.jpg 984 | 3275711232_e261143664.jpg 985 | 1675679141_36c9bc2969.jpg 986 | 2806632713_edd6f6c893.jpg 987 | 3477315700_52a4d740a5.jpg 988 | 2417341107_97dbab9c5e.jpg 989 | 640053014_549d2f23d2.jpg 990 | 3425756814_13909354d4.jpg 991 | 3466891862_9afde75568.jpg 992 | 3430779304_43a2146f4b.jpg 993 | 3530502404_f8c3a3f61c.jpg 994 | 861661418_8a37024ace.jpg 995 | 3068407619_5207b26986.jpg 996 | 3487378989_c051d2715b.jpg 997 | 2189181027_a445b13438.jpg 998 | 2631625732_75b714e685.jpg 999 | 2665586311_9a5f4e3fbe.jpg 1000 | 522652105_a89f1cf260.jpg 1001 | -------------------------------------------------------------------------------- /data/Flickr8k_text/Flickr_8k.testImages.txt: -------------------------------------------------------------------------------- 1 | 3385593926_d3e9c21170.jpg 2 | 2677656448_6b7e7702af.jpg 3 | 311146855_0b65fdb169.jpg 4 | 1258913059_07c613f7ff.jpg 5 | 241347760_d44c8d3a01.jpg 6 | 2654514044_a70a6e2c21.jpg 7 | 2339106348_2df90aa6a9.jpg 8 | 256085101_2c2617c5d0.jpg 9 | 280706862_14c30d734a.jpg 10 | 3072172967_630e9c69d0.jpg 11 | 3482062809_3b694322c4.jpg 12 | 1167669558_87a8a467d6.jpg 13 | 2847615962_c330bded6e.jpg 14 | 3344233740_c010378da7.jpg 15 | 2435685480_a79d42e564.jpg 16 | 3110649716_c17e14670e.jpg 17 | 2511019188_ca71775f2d.jpg 18 | 2521770311_3086ca90de.jpg 19 | 2723477522_d89f5ac62b.jpg 20 | 2218609886_892dcd6915.jpg 21 | 3745451546_fc8ec70cbd.jpg 22 | 2844018783_524b08e5aa.jpg 23 | 3100251515_c68027cc22.jpg 24 | 2207244634_1db1a1890b.jpg 25 | 2943023421_e297f05e11.jpg 26 | 3286822339_5535af6b93.jpg 27 | 2479652566_8f9fac8af5.jpg 28 | 1394368714_3bc7c19969.jpg 29 | 872622575_ba1d3632cc.jpg 30 | 2309860995_c2e2a0feeb.jpg 31 | 241347204_007d83e252.jpg 32 | 3502343542_f9b46688e5.jpg 33 | 757332692_6866ae545c.jpg 34 | 2748729903_3c7c920c4d.jpg 35 | 494792770_2c5f767ac0.jpg 36 | 3213992947_3f3f967a9f.jpg 37 | 2295750198_6d152d7ceb.jpg 38 | 2358898017_24496b80e8.jpg 39 | 3222055946_45f7293bb2.jpg 40 | 444481722_690d0cadcf.jpg 41 | 2647049174_0fb47cee2e.jpg 42 | 1174629344_a2e1a2bdbf.jpg 43 | 2921094201_2ed70a7963.jpg 44 | 2553550034_5901aa9d6c.jpg 45 | 3045613316_4e88862836.jpg 46 | 2706766641_a9df81969d.jpg 47 | 510531976_90bbee22a2.jpg 48 | 485245061_5a5de43e20.jpg 49 | 3070011270_390e597783.jpg 50 | 1352410176_af6b139734.jpg 51 | 1131932671_c8d17751b3.jpg 52 | 3155451946_c0862c70cb.jpg 53 | 2762301555_48a0d0aa24.jpg 54 | 3442242092_e579538d82.jpg 55 | 2415803492_56a673dc25.jpg 56 | 2884301336_dc8e974431.jpg 57 | 3453259666_9ecaa8bb4b.jpg 58 | 3016606751_0e8be20abd.jpg 59 | 3642220260_3aa8a52670.jpg 60 | 2612488996_9450de0e54.jpg 61 | 1499581619_a5f65a882c.jpg 62 | 1427391496_ea512cbe7f.jpg 63 | 3601843201_4809e66909.jpg 64 | 3584561689_b6eb24dd70.jpg 65 | 138718600_f430ebca17.jpg 66 | 3220126881_b0a4f7cccb.jpg 67 | 300314926_0b2e4b64f5.jpg 68 | 3128164023_ebe8da4c32.jpg 69 | 324208502_674488bcea.jpg 70 | 3647750811_395fbd397e.jpg 71 | 3458211052_bb73084398.jpg 72 | 2414397449_2ac3b78e0d.jpg 73 | 3085226474_62aba51179.jpg 74 | 968081289_cdba83ce2e.jpg 75 | 2436081047_bca044c1d3.jpg 76 | 2813992915_f732cf8539.jpg 77 | 3627011534_485f667b10.jpg 78 | 3214237686_6566b8b52f.jpg 79 | 1248940539_46d33ed487.jpg 80 | 2064790732_219e52e19c.jpg 81 | 544576742_283b65fa0d.jpg 82 | 2731171552_4a808c7d5a.jpg 83 | 3609032038_005c789f64.jpg 84 | 3119875880_22f9129a1c.jpg 85 | 3339140382_2e49bc324a.jpg 86 | 2712787899_d85048eb6a.jpg 87 | 3655155990_b0e201dd3c.jpg 88 | 3325497914_f9014d615b.jpg 89 | 468310111_d9396abcbd.jpg 90 | 747921928_48eb02aab2.jpg 91 | 3639967449_137f48b43d.jpg 92 | 2374652725_32f90fa15c.jpg 93 | 3363750526_efcedc47a9.jpg 94 | 2689001252_e0016c89f0.jpg 95 | 3154641421_d1b9b8c24c.jpg 96 | 2631300484_be8621d17b.jpg 97 | 3677318686_b018862bb7.jpg 98 | 405615014_03be7ef618.jpg 99 | 533979933_a95b03323b.jpg 100 | 3437654963_c4fdc17e8b.jpg 101 | 3462454965_a481809cea.jpg 102 | 2256133102_e2c8314ecb.jpg 103 | 3186412658_2ab2ebd397.jpg 104 | 3554634863_5f6f616639.jpg 105 | 3223055565_68973f5d20.jpg 106 | 1554713437_61b64527dd.jpg 107 | 3150742439_b8a352e1e0.jpg 108 | 2238019823_79318d1f11.jpg 109 | 3484832904_08619300d9.jpg 110 | 3365783912_e12c3510d8.jpg 111 | 3185409663_95f6b958d8.jpg 112 | 3207358897_bfa61fa3c6.jpg 113 | 3263497678_8bb688ca01.jpg 114 | 1897025969_0c41688fa6.jpg 115 | 3657016761_d553e514d9.jpg 116 | 3537400880_8f410d747d.jpg 117 | 2419221084_01a14176b4.jpg 118 | 172097782_f0844ec317.jpg 119 | 244571201_0339d8e8d1.jpg 120 | 3467219837_7d62213dec.jpg 121 | 2928152792_b16c73434a.jpg 122 | 401079494_562454c4d6.jpg 123 | 2396691909_6b8c2f7c44.jpg 124 | 3243588540_b418ac7eda.jpg 125 | 3592992234_6d3fe58a70.jpg 126 | 1417031097_ab656bc4bd.jpg 127 | 1122944218_8eb3607403.jpg 128 | 3149919755_f9272b10b3.jpg 129 | 2682382530_f9f8fd1e89.jpg 130 | 2453971388_76616b6a82.jpg 131 | 3079787482_0757e9d167.jpg 132 | 2900274587_f2cbca4c58.jpg 133 | 3301859683_2d5e4b40a3.jpg 134 | 1287073593_f3d2a62455.jpg 135 | 2718495608_d8533e3ac5.jpg 136 | 2054869561_ff723e9eab.jpg 137 | 3567061016_62768dcce1.jpg 138 | 3221036999_3f7b152d8a.jpg 139 | 2554081584_233bdf289a.jpg 140 | 3250695024_93e8ab7305.jpg 141 | 3630332976_fdba22c50b.jpg 142 | 2902269566_419d9f1d8e.jpg 143 | 2544182005_3aa1332bf9.jpg 144 | 2999730677_0cfa1c146e.jpg 145 | 3354883962_170d19bfe4.jpg 146 | 2346401538_f5e8da66fc.jpg 147 | 3605676864_0fb491267e.jpg 148 | 3658427967_6e2e57458d.jpg 149 | 2868575889_2c030aa8ae.jpg 150 | 3494394662_3edfd4a34c.jpg 151 | 3452127051_fa54a902b3.jpg 152 | 3143155555_32b6d24f34.jpg 153 | 470373679_98dceb19e7.jpg 154 | 542317719_ed4dd95dc2.jpg 155 | 2844641033_dab3715a99.jpg 156 | 2588927489_f4da2f11ec.jpg 157 | 2041867793_552819a40b.jpg 158 | 2594042571_2e4666507e.jpg 159 | 493109089_468e105233.jpg 160 | 3109704348_c6416244ce.jpg 161 | 241345811_46b5f157d4.jpg 162 | 3457045393_2bbbb4e941.jpg 163 | 2797149878_bb8e27ecf9.jpg 164 | 543007912_23fc735b99.jpg 165 | 3364026240_645d533fda.jpg 166 | 466956209_2ffcea3941.jpg 167 | 2300168895_a9b83e16fc.jpg 168 | 106490881_5a2dd9b7bd.jpg 169 | 3694991841_141804da1f.jpg 170 | 1523984678_edd68464da.jpg 171 | 2529116152_4331dabf50.jpg 172 | 1773928579_5664a810dc.jpg 173 | 191003285_edd8d0cf58.jpg 174 | 1392272228_cf104086e6.jpg 175 | 2910758605_73a3f5a5c2.jpg 176 | 3507076266_8b17993fbb.jpg 177 | 535830521_aa971319fc.jpg 178 | 70995350_75d0698839.jpg 179 | 909808296_23c427022d.jpg 180 | 3364861247_d590fa170d.jpg 181 | 3545652636_0746537307.jpg 182 | 2869491449_1041485a6b.jpg 183 | 2901074943_041aba4607.jpg 184 | 3480051754_18e5802558.jpg 185 | 3234401637_84e0d14414.jpg 186 | 1317292658_ba29330a0b.jpg 187 | 2140182410_8e2a06fbda.jpg 188 | 3095225232_2e6e6dc92e.jpg 189 | 2280525192_81911f2b00.jpg 190 | 2763044275_aa498eb88b.jpg 191 | 2559503010_84f20b3bc9.jpg 192 | 496110746_a93ca191ae.jpg 193 | 468608014_09fd20eb9b.jpg 194 | 398662202_97e5819b79.jpg 195 | 3141293960_74459f0a24.jpg 196 | 2271755053_e1b1ec8442.jpg 197 | 3181701312_70a379ab6e.jpg 198 | 3523471597_87e0bf3b21.jpg 199 | 2083434441_a93bc6306b.jpg 200 | 54501196_a9ac9d66f2.jpg 201 | 751109943_2a7f8e117f.jpg 202 | 3121521593_18f0ec14f7.jpg 203 | 1432179046_8e3d75cf81.jpg 204 | 3234115903_f4dfc8fc75.jpg 205 | 3497224764_6e17544e0d.jpg 206 | 2878272032_fda05ffac7.jpg 207 | 1536774449_e16b1b6382.jpg 208 | 2228022180_9597b2a458.jpg 209 | 2708686056_1b8f356264.jpg 210 | 1402640441_81978e32a9.jpg 211 | 3437147889_4cf26dd525.jpg 212 | 448658518_eec0b648a6.jpg 213 | 211295363_49010ca38d.jpg 214 | 583174725_6b522b621f.jpg 215 | 2830869109_c4e403eae6.jpg 216 | 488590040_35a3e96c89.jpg 217 | 3217266166_4e0091860b.jpg 218 | 3246991821_750a3097e2.jpg 219 | 3048597471_5697538daf.jpg 220 | 2854959952_3991a385ab.jpg 221 | 2084217208_7bd9bc85e5.jpg 222 | 435827376_4384c3005a.jpg 223 | 2944362789_aebbc22db4.jpg 224 | 2497420371_74788d7ba1.jpg 225 | 309687244_4bdf3b591f.jpg 226 | 3433982387_3fa993cf5a.jpg 227 | 2782433864_5a0c311d87.jpg 228 | 136552115_6dc3e7231c.jpg 229 | 1679617928_a73c1769be.jpg 230 | 352981175_16ff5c07e4.jpg 231 | 1808370027_2088394eb4.jpg 232 | 3651971126_309e6a5e22.jpg 233 | 3708177171_529bb4ff1d.jpg 234 | 2450299735_62c095f40e.jpg 235 | 1387785218_cee67735f5.jpg 236 | 224369028_b1ac40d1fa.jpg 237 | 464251704_b0f0c4c87a.jpg 238 | 2648165716_02e2e74fd6.jpg 239 | 3085667767_66041b202e.jpg 240 | 3211556865_d1d9becf69.jpg 241 | 3503689049_63212220be.jpg 242 | 1107246521_d16a476380.jpg 243 | 3201427741_3033f5b625.jpg 244 | 3540416981_4e74f08cbb.jpg 245 | 410453140_5401bf659a.jpg 246 | 3702436188_2c26192fd0.jpg 247 | 2216695423_1362cb25f3.jpg 248 | 2345984157_724823b1e4.jpg 249 | 3317073508_7e13565c1b.jpg 250 | 2101457132_69c950bc45.jpg 251 | 3285993030_87b0f1d202.jpg 252 | 3220161734_77f42734b9.jpg 253 | 2393264648_a280744f97.jpg 254 | 506367606_7cca2bba9b.jpg 255 | 422763475_0bc814dac6.jpg 256 | 1982852140_56425fa7a2.jpg 257 | 2929506802_5432054d77.jpg 258 | 541063517_35044c554a.jpg 259 | 2595186208_9b16fa0ee3.jpg 260 | 2922973230_5a769ef92a.jpg 261 | 166507476_9be5b9852a.jpg 262 | 114051287_dd85625a04.jpg 263 | 3582742297_1daa29968e.jpg 264 | 396360611_941e5849a3.jpg 265 | 3504881781_6a842e043b.jpg 266 | 3558370311_5734a15890.jpg 267 | 2542662402_d781dd7f7c.jpg 268 | 3532205154_5674b628ea.jpg 269 | 2675685200_0913d84d9b.jpg 270 | 3565598162_56044bc2f7.jpg 271 | 3024172109_a10198e1dd.jpg 272 | 3116769029_f5a76f04ba.jpg 273 | 2061354254_faa5bd294b.jpg 274 | 3576259024_9c05b163aa.jpg 275 | 476759700_8911f087f8.jpg 276 | 2932740428_b15384f389.jpg 277 | 3348385580_10b53391f9.jpg 278 | 2510020918_b2ca0fb2aa.jpg 279 | 1517721825_10176d0683.jpg 280 | 2788945468_74a9618cfa.jpg 281 | 2608289957_044849f73e.jpg 282 | 3328646934_5cca4cebce.jpg 283 | 537532165_e4b7c0e61a.jpg 284 | 2933637854_984614e18b.jpg 285 | 3080056515_3013830309.jpg 286 | 1425069308_488e5fcf9d.jpg 287 | 261490838_2f3ac98b12.jpg 288 | 2926233397_71e617f3a3.jpg 289 | 2963573792_dd51b5fbfb.jpg 290 | 3416091866_a96003d652.jpg 291 | 2431470169_0eeba7d602.jpg 292 | 3099923914_fd450f6d51.jpg 293 | 524105255_b346f288be.jpg 294 | 56489627_e1de43de34.jpg 295 | 2587818583_4aa8e7b174.jpg 296 | 460935487_75b2da7854.jpg 297 | 3316725440_9ccd9b5417.jpg 298 | 2573625591_70291c894a.jpg 299 | 3030566410_393c36a6c5.jpg 300 | 1131800850_89c7ffd477.jpg 301 | 3375549004_beee810e60.jpg 302 | 2470486377_c3a39ccb7b.jpg 303 | 436009777_440c7679a1.jpg 304 | 2862004252_53894bb28b.jpg 305 | 3361990489_92244a58ef.jpg 306 | 293879742_5fe0ffd894.jpg 307 | 3203453897_6317aac6ff.jpg 308 | 1772859261_236c09b861.jpg 309 | 509123893_07b8ea82a9.jpg 310 | 3168123064_d1983b8f92.jpg 311 | 2238759450_6475641bdb.jpg 312 | 246055693_ccb69ac5c6.jpg 313 | 3521374954_37371b49a4.jpg 314 | 3143982558_9e2d44c155.jpg 315 | 3119076670_64b5340530.jpg 316 | 2502905671_c6039804ab.jpg 317 | 1267711451_e2a754b4f8.jpg 318 | 2683963310_20dcd5e566.jpg 319 | 302983277_69a4e732e4.jpg 320 | 3584534971_b44f82c4b9.jpg 321 | 143688283_a96ded20f1.jpg 322 | 1282392036_5a0328eb86.jpg 323 | 2704934519_457dc38986.jpg 324 | 3499720588_c32590108e.jpg 325 | 506738508_327efdf9c3.jpg 326 | 512101751_05a6d93e19.jpg 327 | 2317714088_bcd081f926.jpg 328 | 3275704430_a75828048f.jpg 329 | 2518508760_68d8df7365.jpg 330 | 3254817653_632e840423.jpg 331 | 3113322995_13781860f2.jpg 332 | 2103568100_5d018c495b.jpg 333 | 3518126579_e70e0cbb2b.jpg 334 | 2192131110_8a40e7c028.jpg 335 | 2581066814_179d28f306.jpg 336 | 480505313_2dc686e5db.jpg 337 | 1056338697_4f7d7ce270.jpg 338 | 532457586_bddfc5251d.jpg 339 | 3471841031_a949645ba8.jpg 340 | 3295680663_af21ea648b.jpg 341 | 415793623_6c1225ae27.jpg 342 | 2666205903_8d287669e1.jpg 343 | 3323988406_e3c8fce690.jpg 344 | 3347666612_659e6e2207.jpg 345 | 3439382048_d2e23b2b4c.jpg 346 | 2522297487_57edf117f7.jpg 347 | 3003691049_f4363c2d5c.jpg 348 | 2472980433_210ec62874.jpg 349 | 2307118114_c258e3a47e.jpg 350 | 2410320522_d967f0b75c.jpg 351 | 1408958345_68eea9a4e4.jpg 352 | 498444334_a680d318a1.jpg 353 | 3596131692_91b8a05606.jpg 354 | 2208310655_a3d83080c5.jpg 355 | 2340206885_58754a799a.jpg 356 | 2968182121_b3b491df85.jpg 357 | 3514019869_7de4ece2a5.jpg 358 | 2162564553_96de62c7e6.jpg 359 | 766099402_cdda6964f0.jpg 360 | 3593392955_a4125087f6.jpg 361 | 1472230829_803818a383.jpg 362 | 2774554310_007e980a90.jpg 363 | 2289068031_fe26990183.jpg 364 | 3411393875_a9ff73c67a.jpg 365 | 3406930103_4db7b4dde0.jpg 366 | 497791037_93499238d8.jpg 367 | 3255482333_5bcee79f7e.jpg 368 | 3040033126_9f4b88261b.jpg 369 | 2354540393_a149722680.jpg 370 | 2739331794_4ae78f69a0.jpg 371 | 241346508_0b3907a95b.jpg 372 | 2877503811_4e311253ec.jpg 373 | 3484649669_7bfe62080b.jpg 374 | 1084040636_97d9633581.jpg 375 | 3027397797_4f1d305ced.jpg 376 | 2398605966_1d0c9e6a20.jpg 377 | 2533424347_cf2f84872b.jpg 378 | 189721896_1ffe76d89e.jpg 379 | 2089426086_7acc98a3a8.jpg 380 | 2718024196_3ff660416a.jpg 381 | 3072114570_e1c0127529.jpg 382 | 3516825206_5750824874.jpg 383 | 3224227640_31865b3651.jpg 384 | 200771289_31902164a7.jpg 385 | 3502993968_4ee36afb0e.jpg 386 | 3692593096_fbaea67476.jpg 387 | 447111935_5af98563e3.jpg 388 | 3568197730_a071d7595b.jpg 389 | 3569979711_6507841268.jpg 390 | 180506881_de0f59770f.jpg 391 | 3017521547_f5ef8848e3.jpg 392 | 3503623999_bbd5dcfb18.jpg 393 | 3301811927_a2797339e5.jpg 394 | 3592968286_b63c81bcd2.jpg 395 | 2311690895_0d6efe11c8.jpg 396 | 452419961_6d42ab7000.jpg 397 | 2641770481_c98465ff35.jpg 398 | 2878190821_6e4e03dc5f.jpg 399 | 3725202807_12fbfdd207.jpg 400 | 2938747424_64e64784f0.jpg 401 | 1322323208_c7ecb742c6.jpg 402 | 2458269558_277012780d.jpg 403 | 2985679744_75a7102aab.jpg 404 | 317383917_d8bfa350b6.jpg 405 | 2482629385_f370b290d1.jpg 406 | 293327462_20dee0de56.jpg 407 | 359837950_9e22ffe6c2.jpg 408 | 354642192_3b7666a2dd.jpg 409 | 1786425974_c7c5ad6aa1.jpg 410 | 3767841911_6678052eb6.jpg 411 | 2884420269_225d27f242.jpg 412 | 2715035273_8fc8b1291c.jpg 413 | 3123463486_f5b36a3624.jpg 414 | 2194286203_5dc620006a.jpg 415 | 2815256108_fc1302117d.jpg 416 | 1348304997_afe60a61df.jpg 417 | 888425986_e4b6c12324.jpg 418 | 3485425825_c2f3446e73.jpg 419 | 3217187564_0ffd89dec1.jpg 420 | 3589895574_ee08207d26.jpg 421 | 317109978_cb557802e1.jpg 422 | 2224450291_4c133fabe8.jpg 423 | 3155390408_8e1a81efb2.jpg 424 | 3562050678_4196a7fff3.jpg 425 | 2696866120_254a0345bc.jpg 426 | 3114944484_28b5bb9842.jpg 427 | 751737218_b89839a311.jpg 428 | 352382023_7605223d1c.jpg 429 | 247704641_d883902277.jpg 430 | 3461041826_0e24cdf597.jpg 431 | 3358558292_6ab14193ed.jpg 432 | 525863257_053333e612.jpg 433 | 2112921744_92bf706805.jpg 434 | 375392855_54d46ed5c8.jpg 435 | 1917265421_aeccf1ca38.jpg 436 | 1659358141_0433c9bf99.jpg 437 | 2533642917_a5eace85e6.jpg 438 | 2204550058_2707d92338.jpg 439 | 2764178773_d63b502812.jpg 440 | 180094434_b0f244832d.jpg 441 | 2308978137_bfe776d541.jpg 442 | 3358682439_be4b83544c.jpg 443 | 2602085456_d1beebcb29.jpg 444 | 2589241160_3832440850.jpg 445 | 421322723_3470543368.jpg 446 | 2124040721_bffc0a091a.jpg 447 | 3145967309_b33abe4d84.jpg 448 | 300550441_f44ec3701a.jpg 449 | 1584315962_5b0b45d02d.jpg 450 | 2460797929_66446c13db.jpg 451 | 2909875716_25c8652614.jpg 452 | 3085667865_fa001816be.jpg 453 | 3624327440_bef4f33f32.jpg 454 | 979383193_0a542a059d.jpg 455 | 3009644534_992e9ea2a7.jpg 456 | 561940436_64d6fc125d.jpg 457 | 3393926562_66cc01b001.jpg 458 | 3299820401_c2589186c5.jpg 459 | 3545586120_283d728a97.jpg 460 | 1467533293_a2656cc000.jpg 461 | 373394550_1b2296b8c4.jpg 462 | 539751252_2bd88c456b.jpg 463 | 2621415349_ef1a7e73be.jpg 464 | 2077079696_03380d218b.jpg 465 | 566397227_a469e9e415.jpg 466 | 115684808_cb01227802.jpg 467 | 3387542157_81bfd00072.jpg 468 | 2646116932_232573f030.jpg 469 | 307327914_f98f576adb.jpg 470 | 3044536048_e615466e7f.jpg 471 | 3053743109_a2d780c0d2.jpg 472 | 2265096094_8cc34d669c.jpg 473 | 2283966256_70317e1759.jpg 474 | 3609645320_815c294b65.jpg 475 | 3047264346_e24601bfbf.jpg 476 | 439037721_cdf1fc7358.jpg 477 | 2594902417_f65d8866a8.jpg 478 | 533483374_86c5d4c13e.jpg 479 | 2991575785_bd4868e215.jpg 480 | 3295391572_cbfde03a10.jpg 481 | 3217620013_8b17873273.jpg 482 | 2526041608_a9775ab8d7.jpg 483 | 3028969146_26929ae0e8.jpg 484 | 254295381_d98fa049f4.jpg 485 | 2148916767_644ea6a7fa.jpg 486 | 3200120942_59cfbb3437.jpg 487 | 3591458156_f1a9a33918.jpg 488 | 3354330935_de75be9d2f.jpg 489 | 3320356356_1497e53f80.jpg 490 | 353180303_6a24179c50.jpg 491 | 3064383768_f6838f57da.jpg 492 | 154871781_ae77696b77.jpg 493 | 2616643090_4f2d2d1a44.jpg 494 | 2049051050_20359a434a.jpg 495 | 1472882567_33dc14c8b6.jpg 496 | 170100272_d820db2199.jpg 497 | 2096771662_984441d20d.jpg 498 | 363617160_6cb0c723be.jpg 499 | 3523474077_16e14bc54c.jpg 500 | 3506468593_7e41a6d9f1.jpg 501 | 1446053356_a924b4893f.jpg 502 | 3123351642_3794f2f601.jpg 503 | 523985664_c866af4850.jpg 504 | 3251976937_20625dc2b8.jpg 505 | 2078311270_f01c9eaf4c.jpg 506 | 350443876_c9769f5734.jpg 507 | 2649406158_ded6be38de.jpg 508 | 215214751_e913b6ff09.jpg 509 | 2926595608_69b22be8d4.jpg 510 | 3310067561_b92017acab.jpg 511 | 997722733_0cb5439472.jpg 512 | 1389264266_8170bc1c54.jpg 513 | 2774430374_fee1d793e7.jpg 514 | 3384314832_dffc944152.jpg 515 | 3251648670_9339943ba2.jpg 516 | 2933912528_52b05f84a1.jpg 517 | 3694093650_547259731e.jpg 518 | 2197275664_fabcf3424b.jpg 519 | 2505988632_9541f15583.jpg 520 | 3477715432_79d82487bb.jpg 521 | 241031254_0c6f30e3d1.jpg 522 | 2575647360_f5de38c751.jpg 523 | 3539767254_c598b8e6c7.jpg 524 | 3182121297_38c99b2769.jpg 525 | 1682079482_9a72fa57fa.jpg 526 | 3247052319_da8aba1983.jpg 527 | 249394748_2e4acfbbb5.jpg 528 | 2461616306_3ee7ac1b4b.jpg 529 | 929679367_ff8c7df2ee.jpg 530 | 468102269_135938e209.jpg 531 | 771048251_602e5e8f45.jpg 532 | 2384353160_f395e9a54b.jpg 533 | 3245912109_fdeef6b456.jpg 534 | 3613955682_3860e116cf.jpg 535 | 2866254827_9a8f592017.jpg 536 | 160792599_6a7ec52516.jpg 537 | 3108732084_565b423162.jpg 538 | 2991994607_06f24ec7a6.jpg 539 | 542179694_e170e9e465.jpg 540 | 136644343_0e2b423829.jpg 541 | 3605061440_1d08c80a57.jpg 542 | 2358554995_54ed3baa83.jpg 543 | 3138399980_d6ab8b2272.jpg 544 | 2944836001_b38b516286.jpg 545 | 2949982320_c704b31626.jpg 546 | 2544426580_317b1f1f73.jpg 547 | 3006093003_c211737232.jpg 548 | 2370481277_a3085614c9.jpg 549 | 2707873672_15e6b5d54b.jpg 550 | 3427118504_93126c83e0.jpg 551 | 3203908917_53e53c03d1.jpg 552 | 1415591512_a84644750c.jpg 553 | 2757803246_8aa3499d26.jpg 554 | 2061144717_5b3a1864f0.jpg 555 | 3393343330_b13df4d8ec.jpg 556 | 3569406219_f37ebf7b92.jpg 557 | 3353036763_4cbeba03b2.jpg 558 | 3498327617_d2e3db3ee3.jpg 559 | 1343426964_cde3fb54e8.jpg 560 | 3425851292_de92a072ee.jpg 561 | 3630641436_8f9ac5b9b2.jpg 562 | 2901880865_3fd7b66a45.jpg 563 | 2445283938_ff477c7952.jpg 564 | 3315616181_15dd137e27.jpg 565 | 1572532018_64c030c974.jpg 566 | 2308271254_27fb466eb4.jpg 567 | 2498897831_0bbb5d5b51.jpg 568 | 2170222061_e8bce4a32d.jpg 569 | 2534502836_7a75305655.jpg 570 | 534875358_6ea30d3091.jpg 571 | 370614351_98b8a166b9.jpg 572 | 3429956016_3c7e3096c2.jpg 573 | 514990193_2d2422af2c.jpg 574 | 1287475186_2dee85f1a5.jpg 575 | 2966552760_e65b22cd26.jpg 576 | 486712504_36be449055.jpg 577 | 3015863181_92ff43f4d8.jpg 578 | 348380010_33bb0599ef.jpg 579 | 3670907052_c827593564.jpg 580 | 1626754053_81126b67b6.jpg 581 | 3716244806_97d5a1fb61.jpg 582 | 3641022607_e7a5455d6c.jpg 583 | 2950905787_f2017d3e49.jpg 584 | 3482974845_db4f16befa.jpg 585 | 2883099128_0b056eed9e.jpg 586 | 2310126952_7dc86d88f6.jpg 587 | 2479162876_a5ce3306af.jpg 588 | 3498997518_c2b16f0a0e.jpg 589 | 3232470286_903a61ea16.jpg 590 | 2183227136_8bb657846b.jpg 591 | 2120383553_5825333a3f.jpg 592 | 3544793763_b38546a5e8.jpg 593 | 1404832008_68e432665b.jpg 594 | 3541474181_489f19fae7.jpg 595 | 3042380610_c5ea61eef8.jpg 596 | 486917990_72bd4069af.jpg 597 | 2599444370_9e40103027.jpg 598 | 3468694409_a51571d621.jpg 599 | 494921598_af73bda568.jpg 600 | 197107117_4b438b1872.jpg 601 | 3019842612_8501c1791e.jpg 602 | 909191414_1cf5d85821.jpg 603 | 2945036454_280fa5b29f.jpg 604 | 2666179615_f05a9d8331.jpg 605 | 3030294889_78b2ccbe51.jpg 606 | 509778093_21236bb64d.jpg 607 | 3245070961_8977fdd548.jpg 608 | 533713007_bf9f3e25b4.jpg 609 | 2922222717_12195af92d.jpg 610 | 3191135894_2b4bdabb6d.jpg 611 | 700884207_d3ec546494.jpg 612 | 2196846255_2c1635359a.jpg 613 | 3474406285_01f3d24b71.jpg 614 | 448252603_7d928c900e.jpg 615 | 2860872588_f2c7b30e1a.jpg 616 | 880220939_0ef1c37f1f.jpg 617 | 820169182_f5e78d7d19.jpg 618 | 3436063693_15c8d377a2.jpg 619 | 1262583859_653f1469a9.jpg 620 | 3185371756_ff4e9fa8a6.jpg 621 | 3591462960_86045906bd.jpg 622 | 3619416477_9d18580a14.jpg 623 | 3459156091_c1879ebe28.jpg 624 | 537559285_29be110134.jpg 625 | 3052196390_c59dd24ca8.jpg 626 | 2490768374_45d94fc658.jpg 627 | 150387174_24825cf871.jpg 628 | 1962729184_6996e128e7.jpg 629 | 2306674172_dc07c7f847.jpg 630 | 2086513494_dbbcb583e7.jpg 631 | 2652522323_9218afd8c2.jpg 632 | 3399284917_721aefe2a7.jpg 633 | 370713359_7560808550.jpg 634 | 2843695880_eeea6c67db.jpg 635 | 2676764246_c58205a365.jpg 636 | 3107513635_fe8a21f148.jpg 637 | 2885387575_9127ea10f1.jpg 638 | 3223224391_be50bf4f43.jpg 639 | 1461667284_041c8a2475.jpg 640 | 2196316998_3b2d63f01f.jpg 641 | 1998457059_c9ac9a1e1a.jpg 642 | 3294209955_a1f1e2cc19.jpg 643 | 488408004_a1e26d4886.jpg 644 | 3135504530_0f4130d8f8.jpg 645 | 3217910740_d1d61c08ab.jpg 646 | 3602838407_bf13e49243.jpg 647 | 2984174290_a915748d77.jpg 648 | 424779662_568f9606d0.jpg 649 | 2431832075_00aa1a4457.jpg 650 | 624742559_ff467d8ebc.jpg 651 | 3157847991_463e006a28.jpg 652 | 2893374123_087f98d58a.jpg 653 | 3359551687_68f2f0212a.jpg 654 | 3070031806_3d587c2a66.jpg 655 | 2480850054_de3433b54a.jpg 656 | 3216926094_bc975e84b9.jpg 657 | 3449114979_6cdc3e8da8.jpg 658 | 2543589122_ec3e55f434.jpg 659 | 3530843182_35af2c821c.jpg 660 | 3472364264_dbde5a8d0a.jpg 661 | 3715469645_6d1dc019b3.jpg 662 | 2196107384_361d73a170.jpg 663 | 1561658940_a947f2446a.jpg 664 | 3655074079_7df3812bc5.jpg 665 | 3004823335_9b82cbd8a7.jpg 666 | 2495931537_9b8d4474b6.jpg 667 | 293881927_ac62900fd4.jpg 668 | 3162045919_c2decbb69b.jpg 669 | 505929313_7668f021ab.jpg 670 | 3244470342_c08f6bb17e.jpg 671 | 3655964639_21e76383d0.jpg 672 | 3718964174_cb2dc1615e.jpg 673 | 3388330419_85d72f7cda.jpg 674 | 2128119486_4407061c40.jpg 675 | 917574521_74fab68514.jpg 676 | 400851260_5911898657.jpg 677 | 270816949_ffad112278.jpg 678 | 421730441_6b2267fd31.jpg 679 | 429851331_b248ca01cd.jpg 680 | 241345905_5826a72da1.jpg 681 | 2102360862_264452db8e.jpg 682 | 3051384385_c5c850c1f8.jpg 683 | 3500136982_bf7a85531e.jpg 684 | 416788726_5b4eb1466e.jpg 685 | 245895500_a4eb97af02.jpg 686 | 3259002340_707ce96858.jpg 687 | 2796801478_8ebd7e550b.jpg 688 | 57422853_b5f6366081.jpg 689 | 1311388430_4ab0cd1a1f.jpg 690 | 522063319_33827f1627.jpg 691 | 384577800_fc325af410.jpg 692 | 3159995270_17334ccb5b.jpg 693 | 2229179070_dc8ea8582e.jpg 694 | 1764955991_5e53a28c87.jpg 695 | 670609997_5c7fdb3f0b.jpg 696 | 86412576_c53392ef80.jpg 697 | 260828892_7925d27865.jpg 698 | 3737539561_d1dc161040.jpg 699 | 3262075846_5695021d84.jpg 700 | 3227148358_f152303584.jpg 701 | 2373234213_4ebe9c4ee5.jpg 702 | 2914206497_5e36ac6324.jpg 703 | 488356951_b3b77ad832.jpg 704 | 2105756457_a100d8434e.jpg 705 | 3506560025_8d0f4f9ac4.jpg 706 | 3456362961_d8f7e347a8.jpg 707 | 3044500219_778f9f2b71.jpg 708 | 2301525531_edde12d673.jpg 709 | 3280052365_c4644bf0a5.jpg 710 | 3640422448_a0f42e4559.jpg 711 | 2396025708_e4a72e2558.jpg 712 | 1433142189_cda8652603.jpg 713 | 3214573346_d3a57f0328.jpg 714 | 3218480482_66af7587c8.jpg 715 | 2021613437_d99731f986.jpg 716 | 2525270674_4ab536e7ec.jpg 717 | 3470951932_27ed74eb0b.jpg 718 | 2870875612_2cbb9e4a3c.jpg 719 | 2541104331_a2d65cfa54.jpg 720 | 444057017_f1e0fcaef7.jpg 721 | 3597326009_3678a98a43.jpg 722 | 3360930596_1e75164ce6.jpg 723 | 247637795_fdf26a03cf.jpg 724 | 3696698390_989f1488e7.jpg 725 | 3421789737_f625dd17ed.jpg 726 | 53043785_c468d6f931.jpg 727 | 3058439373_9276a4702a.jpg 728 | 2100816230_ff866fb352.jpg 729 | 2729655904_1dd01922fb.jpg 730 | 3270691950_88583c3524.jpg 731 | 3729525173_7f984ed776.jpg 732 | 540721368_12ac732c6c.jpg 733 | 3686924335_3c51e8834a.jpg 734 | 2295216243_0712928988.jpg 735 | 3450874870_c4dcf58fb3.jpg 736 | 3061481868_d1e00b1f2e.jpg 737 | 308487515_7852928f90.jpg 738 | 263854883_0f320c1562.jpg 739 | 3549583146_3e8bb2f7e9.jpg 740 | 3542484764_77d8920ec9.jpg 741 | 3208074567_ac44aeb3f3.jpg 742 | 3167365436_c379bda282.jpg 743 | 2693425189_47740c22ed.jpg 744 | 434792818_56375e203f.jpg 745 | 3635577874_48ebaac734.jpg 746 | 3413571342_b9855795e2.jpg 747 | 2475162978_2c51048dca.jpg 748 | 2160266952_a2ab39191b.jpg 749 | 463978865_c87c6ca84c.jpg 750 | 3585487286_ef9a8d4c56.jpg 751 | 3239021459_a6b71bb400.jpg 752 | 2662845514_8620aaee96.jpg 753 | 3044746136_8b89da5f40.jpg 754 | 343218198_1ca90e0734.jpg 755 | 2924259848_effb4dcb82.jpg 756 | 3720366614_dfa8fe1088.jpg 757 | 1356796100_b265479721.jpg 758 | 2905942129_2b4bf59bc0.jpg 759 | 2660008870_b672a4c76a.jpg 760 | 2274992140_bb9e868bb8.jpg 761 | 3538213870_9856a76b2a.jpg 762 | 2206960564_325ed0c7ae.jpg 763 | 2839038702_e168128665.jpg 764 | 424416723_19c56cb365.jpg 765 | 2876993733_cb26107d18.jpg 766 | 223299142_521aedf9e7.jpg 767 | 3347798761_5c5260b000.jpg 768 | 1220401002_3f44b1f3f7.jpg 769 | 3564543247_05cdbc31cf.jpg 770 | 3385246141_a263d1053e.jpg 771 | 3334537556_a2cf4e9b9a.jpg 772 | 2909955251_4b326a46a7.jpg 773 | 2247889670_413db8094b.jpg 774 | 3186073578_6e115f45f5.jpg 775 | 3192069971_83c5a90b4c.jpg 776 | 3422458549_f3f3878dbf.jpg 777 | 2891617125_f939f604c7.jpg 778 | 279728508_6bd7281f3c.jpg 779 | 2913965136_2d00136697.jpg 780 | 3692892751_f6574e2700.jpg 781 | 2288099178_41091aa00c.jpg 782 | 476233374_e1396998ef.jpg 783 | 2559921948_06af25d566.jpg 784 | 2189995738_352607a63b.jpg 785 | 3359530430_249f51972c.jpg 786 | 317488612_70ac35493b.jpg 787 | 2842865689_e37256d9ce.jpg 788 | 2225231022_1632d0a5aa.jpg 789 | 327415627_6313d32a64.jpg 790 | 2292406847_f366350600.jpg 791 | 3571147934_d1c8af1d6e.jpg 792 | 2607462776_78e639d891.jpg 793 | 801607443_f15956d1ce.jpg 794 | 2176980976_7054c99621.jpg 795 | 3523559027_a65619a34b.jpg 796 | 1329832826_432538d331.jpg 797 | 260520547_944f9f4c91.jpg 798 | 2473738924_eca928d12f.jpg 799 | 1765164972_92dac06fa9.jpg 800 | 2806710650_e201acd913.jpg 801 | 2501595799_6316001e89.jpg 802 | 3697359692_8a5cdbe4fe.jpg 803 | 3688858505_e8afd1475d.jpg 804 | 3396157719_6807d52a81.jpg 805 | 473220329_819a913bbb.jpg 806 | 3228069008_edb2961fc4.jpg 807 | 2861932486_52befd8592.jpg 808 | 758921886_55a351dd67.jpg 809 | 791338571_7f38510bf7.jpg 810 | 3435035138_af32890a4c.jpg 811 | 1339596997_8ac29c1841.jpg 812 | 3245460937_2710a82709.jpg 813 | 3256275785_9c3af57576.jpg 814 | 2856080862_95d793fa9d.jpg 815 | 3179336562_c3d0c0a3bd.jpg 816 | 430173345_86388d8822.jpg 817 | 1096395242_fc69f0ae5a.jpg 818 | 2378149488_648e5deeac.jpg 819 | 2358561039_e215a8d6cd.jpg 820 | 2667015110_1670324a33.jpg 821 | 500446858_125702b296.jpg 822 | 226607225_44d696db6b.jpg 823 | 2496370758_a3fbc49837.jpg 824 | 3259991972_fce3ab18b2.jpg 825 | 229862312_1a0ba19dab.jpg 826 | 3333921867_6cc7d7c73d.jpg 827 | 2248487950_c62d0c81a9.jpg 828 | 3074842262_62b1b2168c.jpg 829 | 561417861_8e25d0c0e8.jpg 830 | 2646046871_c3a5dbb971.jpg 831 | 2944952557_8484f0da8f.jpg 832 | 3244747165_17028936e0.jpg 833 | 2285570521_05015cbf4b.jpg 834 | 315880837_90db309bab.jpg 835 | 3375070563_3c290a7991.jpg 836 | 1298295313_db1f4c6522.jpg 837 | 3585598356_8ce815bbb9.jpg 838 | 2473689180_e9d8fd656a.jpg 839 | 3258874419_23fec1bdc1.jpg 840 | 1237985362_dbafc59280.jpg 841 | 3290105461_7590f23371.jpg 842 | 2644430445_47c985a2ee.jpg 843 | 732468337_a37075225e.jpg 844 | 113678030_87a6a6e42e.jpg 845 | 2120411340_104eb610b1.jpg 846 | 2450453051_f1d4a78ab4.jpg 847 | 2831217847_555b2f95ca.jpg 848 | 3192266178_f9bf5d3dba.jpg 849 | 326456451_effadbbe49.jpg 850 | 2663794355_e726ec7e05.jpg 851 | 3364151356_eecd07a23e.jpg 852 | 2251747182_6b67a3ab8b.jpg 853 | 3139160252_75109e9e05.jpg 854 | 219070971_ae43410b9e.jpg 855 | 1674612291_7154c5ab61.jpg 856 | 136886677_6026c622eb.jpg 857 | 3398746625_5199beea71.jpg 858 | 3220650628_4ed964e5b4.jpg 859 | 1082379191_ec1e53f996.jpg 860 | 3741462565_cc35966b7a.jpg 861 | 1174525839_7c1e6cfa86.jpg 862 | 3572267708_9d8a81d4a4.jpg 863 | 1509786421_f03158adfc.jpg 864 | 3155987659_b9ea318dd3.jpg 865 | 925491651_57df3a5b36.jpg 866 | 2735558076_0d7bbc18fc.jpg 867 | 300922408_05a4f9938c.jpg 868 | 1490670858_e122df2560.jpg 869 | 2953015871_cae796b6e7.jpg 870 | 524282699_71e678a6bd.jpg 871 | 2890113532_ab2003d74e.jpg 872 | 1456393634_74022d9056.jpg 873 | 2813033949_e19fa08805.jpg 874 | 745880539_cd3f948837.jpg 875 | 2480327661_fb69829f57.jpg 876 | 3125309108_1011486589.jpg 877 | 3287549827_04dec6fb6e.jpg 878 | 391579205_c8373b5411.jpg 879 | 2610447973_89227ff978.jpg 880 | 2698666984_13e17236ae.jpg 881 | 339350939_6643bfb270.jpg 882 | 127490019_7c5c08cb11.jpg 883 | 1714316707_8bbaa2a2ba.jpg 884 | 3556598205_86c180769d.jpg 885 | 757046028_ff5999f91b.jpg 886 | 132489044_3be606baf7.jpg 887 | 3613800013_5a54968ab0.jpg 888 | 2577972703_a22c5f2a87.jpg 889 | 2073964624_52da3a0fc4.jpg 890 | 2194494220_bb2178832c.jpg 891 | 2215136723_960edfea49.jpg 892 | 2759860913_f75b39d783.jpg 893 | 3225310099_d8e419ba56.jpg 894 | 2938120171_970564e3d8.jpg 895 | 754852108_72f80d421f.jpg 896 | 3187395715_f2940c2b72.jpg 897 | 3281078518_630a7a7f4f.jpg 898 | 3071676551_a65741e372.jpg 899 | 3106026005_473a7b1c8c.jpg 900 | 3523874798_9ba2fa46e3.jpg 901 | 245252561_4f20f1c89e.jpg 902 | 3685328542_ab999b83bb.jpg 903 | 3613424631_3ae537624f.jpg 904 | 3584930205_a3f58a4b7c.jpg 905 | 127488876_f2d2a89588.jpg 906 | 3578841731_f775cab089.jpg 907 | 2934359101_cdf57442dc.jpg 908 | 339658315_fbb178c252.jpg 909 | 2991994415_504d1c0a03.jpg 910 | 3349451628_4249a21c8f.jpg 911 | 3197917064_e679a44b8e.jpg 912 | 2657484284_daa07a3a1b.jpg 913 | 2894217628_f1a4153dca.jpg 914 | 3424424006_98f9d1921c.jpg 915 | 2526585002_10987a63f3.jpg 916 | 1836335410_de8313a64e.jpg 917 | 2443380641_7b38d18f5b.jpg 918 | 2208067635_39a03834ca.jpg 919 | 3427233064_6af01bfc5c.jpg 920 | 799486353_f665d7b0f0.jpg 921 | 3741827382_71e93298d0.jpg 922 | 3578914491_36019ba703.jpg 923 | 3197981073_3156963446.jpg 924 | 416960865_048fd3f294.jpg 925 | 197504190_fd1fc3d4b7.jpg 926 | 2484190118_e89363c465.jpg 927 | 2602258549_7401a3cdae.jpg 928 | 493621130_152bdd4e91.jpg 929 | 3332467180_d72f9b067d.jpg 930 | 2981702521_2459f2c1c4.jpg 931 | 461505235_590102a5bf.jpg 932 | 1490213660_9ea45550cf.jpg 933 | 300577375_26cc2773a1.jpg 934 | 2549968784_39bfbe44f9.jpg 935 | 2075321027_c8fcbaf581.jpg 936 | 1547883892_e29b3db42e.jpg 937 | 2886411666_72d8b12ce4.jpg 938 | 2239938351_43c73c887c.jpg 939 | 2918769188_565dd48060.jpg 940 | 3610683688_bbe6d725ed.jpg 941 | 3025549604_38b86198f5.jpg 942 | 2073105823_6dacade004.jpg 943 | 2447284966_d6bbdb4b6e.jpg 944 | 2600867924_cd502fc911.jpg 945 | 2333288869_8c01e4c859.jpg 946 | 3589367895_5d3729e3ea.jpg 947 | 96420612_feb18fc6c6.jpg 948 | 3375991133_87d7c40925.jpg 949 | 3320032226_63390d74a6.jpg 950 | 2971431335_e192613db4.jpg 951 | 219301555_17883a51bd.jpg 952 | 3222041930_f642f49d28.jpg 953 | 3187492926_8aa85f80c6.jpg 954 | 3673165148_67f217064f.jpg 955 | 270724499_107481c88f.jpg 956 | 2182488373_df73c7cc09.jpg 957 | 2421446839_fe7d46c177.jpg 958 | 2603792708_18a97bac97.jpg 959 | 2822290399_97c809d43b.jpg 960 | 1332722096_1e3de8ae70.jpg 961 | 3694064560_467683205b.jpg 962 | 3263395801_5e4cee2b9e.jpg 963 | 3701291852_373ea46bb6.jpg 964 | 2343525685_3eba3b6686.jpg 965 | 416106657_cab2a107a5.jpg 966 | 387830531_e89c192b92.jpg 967 | 2892995070_39f3c9a56e.jpg 968 | 3432550415_e7b77232de.jpg 969 | 3564312955_716e86c48b.jpg 970 | 3238951136_2a99f1a1a8.jpg 971 | 3595643050_d312e4b652.jpg 972 | 3139876823_859c7d7c23.jpg 973 | 3473264983_67917a931f.jpg 974 | 2994179598_a45c2732b5.jpg 975 | 491405109_798222cfd0.jpg 976 | 3115174046_9e96b9ce47.jpg 977 | 3631986552_944ea208fc.jpg 978 | 3350786891_6d39b234e9.jpg 979 | 3062173277_bfb5ef4c45.jpg 980 | 3108197858_441ff38565.jpg 981 | 1224851143_33bcdd299c.jpg 982 | 3458559770_12cf9f134e.jpg 983 | 3425835357_204e620a66.jpg 984 | 3214885227_2be09e7cfb.jpg 985 | 2854207034_1f00555703.jpg 986 | 2167644298_100ca79f54.jpg 987 | 241346971_c100650320.jpg 988 | 1386964743_9e80d96b05.jpg 989 | 3397220683_4aca010f86.jpg 990 | 2473791980_805c819bd4.jpg 991 | 241345844_69e1c22464.jpg 992 | 3256043809_47258e0b3e.jpg 993 | 2351479551_e8820a1ff3.jpg 994 | 3514179514_cbc3371b92.jpg 995 | 1119015538_e8e796281e.jpg 996 | 3727752439_907795603b.jpg 997 | 3430607596_7e4f74e3ff.jpg 998 | 3259666643_ae49524c81.jpg 999 | 2623930900_b9df917b82.jpg 1000 | 3490736665_38710f4b91.jpg 1001 | -------------------------------------------------------------------------------- /data/Flickr8k_text/readme.txt: -------------------------------------------------------------------------------- 1 | If you use this corpus / data: 2 | 3 | Please cite: M. Hodosh, P. Young and J. Hockenmaier (2013) "Framing Image Description as a Ranking Task: Data, Models and Evaluation Metrics", Journal of Artifical Intellegence Research, Volume 47, pages 853-899 4 | http://www.jair.org/papers/paper3994.html 5 | 6 | 7 | Captions, Dataset Splits, and Human Annotations : 8 | 9 | 10 | Flickr8k.token.txt - the raw captions of the Flickr8k Dataset . The first column is the ID of the caption which is "image address # caption number" 11 | 12 | Flickr8k.lemma.txt - the lemmatized version of the above captions 13 | 14 | Flickr_8k.trainImages.txt - The training images used in our experiments 15 | Flickr_8k.devImages.txt - The development/validation images used in our experiments 16 | Flickr_8k.testImages.txt - The test images used in our experiments 17 | 18 | 19 | ExpertAnnotations.txt is the expert judgments. The first two columns are the image and caption IDs. Caption IDs are #<0-4>. The next three columns are the expert judgments for that image-caption pair. Scores range from 1 to 4, with a 1 indicating that the caption does not describe the image at all, a 2 indicating the caption describes minor aspects of the image but does not describe the image, a 3 indicating that the caption almost describes the image with minor mistakes, and a 4 indicating that the caption describes the image. 20 | 21 | 22 | CrowdFlowerAnnotations.txt contains the CrowdFlower judgments. The first two columns are the image and caption IDs. The third column is the percent of Yeses, the fourth column is the total number of Yeses, the fifth column is the total number of Noes. A Yes means that the caption describes the image (possibly with minor mistakes), while a No means that the caption does not describe the image. Each image-caption pair has a minimum of three judgments, but some may have more. 23 | -------------------------------------------------------------------------------- /data/README.md: -------------------------------------------------------------------------------- 1 | Please download **Flickr8k_Dataset.zip** from here: http://nlp.cs.illinois.edu/HockenmaierGroup/Framing_Image_Description/Flickr8k_Dataset.zip 2 |
3 | Extract **Flickr8k_Dataset.zip** and place **Flicker8k_Dataset** folder here 4 | -------------------------------------------------------------------------------- /images/image_captioning_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aub-mind/Arabic-Image-Captioning/2fcffc746faa35c85c18f14228f4aba22c1fa51b/images/image_captioning_example.png -------------------------------------------------------------------------------- /images/seq2seq-image-captioning-arabic-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aub-mind/Arabic-Image-Captioning/2fcffc746faa35c85c18f14228f4aba22c1fa51b/images/seq2seq-image-captioning-arabic-2.png -------------------------------------------------------------------------------- /images/seq2seq-image-captioning-arabic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aub-mind/Arabic-Image-Captioning/2fcffc746faa35c85c18f14228f4aba22c1fa51b/images/seq2seq-image-captioning-arabic.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | absl-py==0.6.1 2 | arabic-reshaper==2.0.14 3 | astor==0.7.1 4 | Babel==2.6.0 5 | backcall==0.1.0 6 | beautifulsoup4==4.6.3 7 | bleach==3.0.2 8 | boto==2.49.0 9 | boto3==1.9.48 10 | botocore==1.12.48 11 | bz2file==0.98 12 | cachetools==3.0.0 13 | certifi==2018.10.15 14 | chardet==3.0.4 15 | colorama==0.4.0 16 | configparser==3.5.0 17 | cycler==0.10.0 18 | dateutils==0.6.6 19 | decorator==4.3.0 20 | defusedxml==0.5.0 21 | docutils==0.14 22 | entrypoints==0.2.3 23 | et-xmlfile==1.0.1 24 | future==0.17.1 25 | gast==0.2.0 26 | gensim==3.6.0 27 | google-api-core==1.5.2 28 | google-api-python-client==1.7.4 29 | google-auth==1.6.1 30 | google-auth-httplib2==0.0.3 31 | google-cloud-core==0.28.1 32 | google-cloud-translate==1.3.1 33 | googleapis-common-protos==1.5.5 34 | googletrans==2.3.0 35 | gp-python-client==1.0.0 36 | grpcio==1.16.1 37 | h5py==2.8.0 38 | httplib2==0.12.0 39 | idna==2.7 40 | ipykernel==5.1.0 41 | ipython==7.1.1 42 | ipython-genutils==0.2.0 43 | ipywidgets==7.4.2 44 | jdcal==1.4 45 | jedi==0.13.1 46 | Jinja2==2.10 47 | jmespath==0.9.3 48 | jsonschema==2.6.0 49 | jupyter==1.0.0 50 | jupyter-client==5.2.3 51 | jupyter-console==6.0.0 52 | jupyter-contrib-core==0.3.3 53 | jupyter-contrib-nbextensions==0.5.0 54 | jupyter-core==4.4.0 55 | jupyter-highlight-selected-word==0.2.0 56 | jupyter-latex-envs==1.4.4 57 | jupyter-nbextensions-configurator==0.4.0 58 | Keras==2.2.4 59 | Keras-Applications==1.0.6 60 | Keras-Preprocessing==1.0.5 61 | keras-tqdm==2.0.1 62 | kiwisolver==1.0.1 63 | langdetect==1.0.7 64 | lxml==4.2.5 65 | Markdown==3.0.1 66 | MarkupSafe==1.1.0 67 | matplotlib==3.0.2 68 | mistune==0.8.4 69 | nbconvert==5.4.0 70 | nbformat==4.4.0 71 | nltk==3.4 72 | notebook==5.7.2 73 | numpy==1.15.4 74 | openpyxl==2.5.11 75 | pandas==0.23.4 76 | pandocfilters==1.4.2 77 | parso==0.3.1 78 | pickleshare==0.7.5 79 | Pillow==5.3.0 80 | prometheus-client==0.4.2 81 | prompt-toolkit==2.0.7 82 | protobuf==3.6.1 83 | py-translator==1.8.9 84 | pyasn1==0.4.4 85 | pyasn1-modules==0.2.2 86 | Pygments==2.2.0 87 | pyparsing==2.3.0 88 | python-bidi==0.4.0 89 | python-dateutil==2.7.5 90 | python-slugify==1.2.6 91 | pytz==2018.7 92 | pywinpty==0.5.4 93 | PyYAML==3.13 94 | pyzmq==17.1.2 95 | qtconsole==4.4.3 96 | requests==2.20.1 97 | rsa==4.0 98 | s3transfer==0.1.13 99 | scapy==2.4.0 100 | scikit-learn==0.20.0 101 | scipy==1.1.0 102 | seaborn==0.9.0 103 | selenium==3.141.0 104 | Send2Trash==1.5.0 105 | singledispatch==3.4.0.3 106 | six==1.11.0 107 | smart-open==1.7.1 108 | tensorboard==1.12.0 109 | tensorflow-gpu==1.12.0 110 | termcolor==1.1.0 111 | terminado==0.8.1 112 | testpath==0.4.2 113 | tornado==5.1.1 114 | tqdm==4.28.1 115 | traitlets==4.3.2 116 | Unidecode==1.0.23 117 | uritemplate==3.0.0 118 | urllib3==1.24.1 119 | wcwidth==0.1.7 120 | webencodings==0.5.1 121 | Werkzeug==0.14.1 122 | widgetsnbextension==3.4.2 123 | xlrd==1.1.0 124 | -------------------------------------------------------------------------------- /resources/.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | db.sqlite3 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # Environments 85 | .env 86 | .venv 87 | env/ 88 | venv/ 89 | ENV/ 90 | env.bak/ 91 | venv.bak/ 92 | 93 | # Spyder project settings 94 | .spyderproject 95 | .spyproject 96 | 97 | # Rope project settings 98 | .ropeproject 99 | 100 | # mkdocs documentation 101 | /site 102 | 103 | # mypy 104 | .mypy_cache/ 105 | 106 | 107 | 108 | Flickr8K_features.pkl 109 | vgg16_weights_tf_dim_ordering_tf_kernels.h5 -------------------------------------------------------------------------------- /resources/README.md: -------------------------------------------------------------------------------- 1 | Please download VGG16 weights from here: https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels.h5 2 |
3 | and place them here.. 4 |



5 | Please download **Flickr8K_features.pkl** from here: https://drive.google.com/file/d/1hAbpX0EQvOWk6EnSHsSKoqP3Ncm167GB/view?usp=sharing 6 |
7 | and place it here.. 8 |
9 | or you can create your own **Flickr8K_features.pkl** by running the **Transfer Learning** section in the notebook.. -------------------------------------------------------------------------------- /resources/arabic_preprocessing.py: -------------------------------------------------------------------------------- 1 | 2 | # coding: utf-8 3 | 4 | # # Preprocessing Arabic Text 5 | 6 | # ### this module aims to preprocess arabic text in order to be efficiently used for Natural Language Processing & Machine Learning 7 | # ### Preprocessing includes: 8 | # - remove punctuations & diacritics 9 | # - normalize (or standarize) Hamza & Ha2 10 | # - remove repeating characters 11 | # - remove english characters 12 | # - remove one-character words 13 | 14 | # ### import necessary libraries 15 | 16 | # In[1]: 17 | 18 | 19 | import re 20 | #import nltk # if nltk is being used for the first time, you may need to download some resources: nltk.download() 21 | #from nltk.stem.arlstem import ARLSTem # requires minimum nltk version of 3.2.5 22 | import string 23 | 24 | 25 | # ### Defining Arabic preprocessing class 26 | 27 | # In[2]: 28 | 29 | 30 | class Arabic_preprocessing: 31 | 32 | 33 | def __init__(self): 34 | 35 | #preparing punctuations list 36 | arabic_punctuations = '''`÷×؛<>_()*&^%][ـ،/:"؟.,'{}~¦+|!”…“–ـ''' 37 | english_punctuations = string.punctuation 38 | self.all_punctuations = set(arabic_punctuations + english_punctuations) 39 | 40 | # initializing the stemmer 41 | #self.stemmer = ARLSTem() # requires minimum NLTK version of 3.2.5 42 | 43 | self.arabic_diacritics = re.compile(""" 44 | ّ | # Tashdid 45 | َ | # Fatha 46 | ً | # Tanwin Fath 47 | ُ | # Damma 48 | ٌ | # Tanwin Damm 49 | ِ | # Kasra 50 | ٍ | # Tanwin Kasr 51 | ْ | # Sukun 52 | ـ # Tatwil/Kashida 53 | 54 | """, re.VERBOSE) 55 | 56 | 57 | def normalize_arabic(self, text): 58 | text = re.sub("[إأآاٱ]", "ا", text) 59 | text = re.sub("ى", "ي", text) 60 | #text = re.sub("ؤ", "ء", text) 61 | #text = re.sub("ئ", "ء", text) 62 | text = re.sub("ة", "ه", text) # replace ta2 marboota by ha2 63 | text = re.sub("گ", "ك", text) 64 | text = re.sub("\u0640", '', text) # remove tatweel 65 | return text 66 | 67 | 68 | def remove_punctuations(self, text): 69 | return ''.join([c for c in text if c not in self.all_punctuations]) #remove punctuations 70 | 71 | 72 | def remove_diacritics(self, text): 73 | text = re.sub(self.arabic_diacritics, '', text) 74 | return text 75 | 76 | 77 | def remove_repeating_char(self, text): 78 | return re.sub(r'(.)\1+', r'\1', text) 79 | 80 | 81 | def remove_mention(self, text): 82 | return re.sub(r'@\S+', '', text) 83 | 84 | def hashtag_match(self, match_object): 85 | return match_object.group(1).replace('_', ' ') 86 | 87 | def normalize_hashtag(self, text): 88 | return re.sub(r'#(\S+)', self.hashtag_match, text) 89 | 90 | def emojis_match(self, match_object): 91 | return ' ' + ' '.join(list(match_object.group(1))) + ' ' 92 | 93 | def separate_emojis(self, text): 94 | emojis_unicode = r'([\U0001F600-\U0001F64F\U00002000-\U00003000]+)' 95 | return re.sub(emojis_unicode, self.emojis_match, text) 96 | 97 | def replace_emojis(self, text): 98 | new_text = "" 99 | for l in text: 100 | new_text += self.emojis_lexicon_dict[l] if l in self.emojis_lexicon_dict.keys() else l 101 | return new_text 102 | 103 | def remove_english_characters(self, text): 104 | return re.sub(r'[a-zA-Z]+', '', text) 105 | 106 | def clean_stop_words(self): 107 | # normalize, and remove diacritics from, stop words to increase posibility of matching with normalized data 108 | self.stop_words = [self.remove_diacritics(self.normalize_arabic(word)) for word in self.stop_words] 109 | 110 | def preprocess_arabic_text(self, text): 111 | #self.clean_stop_words() 112 | #text = text.replace('\\n', ' ').replace('\n', ' ') 113 | #text = self.remove_mention(text) 114 | #text = self.normalize_hashtag(text) 115 | text = self.remove_punctuations(text) 116 | text = self.remove_diacritics(text) 117 | text = self.normalize_arabic(text) 118 | #text = self.separate_emojis(text) 119 | #if replace_emojis: text = self.replace_emojis(text) 120 | #text = self.remove_repeating_char(text) 121 | text = self.remove_english_characters(text) 122 | #words = nltk.word_tokenize(text) 123 | #words = [word for word in words if word not in self.stop_words] 124 | #if stem: words = [self.stemmer.stem(word) for word in words] 125 | text = ' '.join([w for w in text.split() if len(w)>1 and w.isalpha()]) #remove one-character & numeric words 126 | return text 127 | 128 | -------------------------------------------------------------------------------- /resources/bleu.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # 3 | # File Name : bleu.py 4 | # 5 | # Description : Wrapper for BLEU scorer. 6 | # 7 | # Creation Date : 06-01-2015 8 | # Last Modified : Thu 19 Mar 2015 09:13:28 PM PDT 9 | # Authors : Hao Fang and Tsung-Yi Lin 10 | 11 | #from bleu_scorer import BleuScorer 12 | 13 | 14 | 15 | 16 | 17 | 18 | '''Provides: 19 | cook_refs(refs, n=4): Transform a list of reference sentences as strings into a form usable by cook_test(). 20 | cook_test(test, refs, n=4): Transform a test sentence as a string (together with the cooked reference sentences) into a form usable by score_cooked(). 21 | ''' 22 | 23 | import copy 24 | import sys, math, re 25 | from collections import defaultdict 26 | 27 | def precook(s, n=4, out=False): 28 | """Takes a string as input and returns an object that can be given to 29 | either cook_refs or cook_test. This is optional: cook_refs and cook_test 30 | can take string arguments as well.""" 31 | words = s.split() 32 | counts = defaultdict(int) 33 | for k in range(1,n+1): 34 | for i in range(len(words)-k+1): 35 | ngram = tuple(words[i:i+k]) 36 | counts[ngram] += 1 37 | return (len(words), counts) 38 | 39 | def cook_refs(refs, eff=None, n=4): ## lhuang: oracle will call with "average" 40 | '''Takes a list of reference sentences for a single segment 41 | and returns an object that encapsulates everything that BLEU 42 | needs to know about them.''' 43 | 44 | reflen = [] 45 | maxcounts = {} 46 | for ref in refs: 47 | rl, counts = precook(ref, n) 48 | reflen.append(rl) 49 | for (ngram,count) in counts.items(): 50 | maxcounts[ngram] = max(maxcounts.get(ngram,0), count) 51 | 52 | # Calculate effective reference sentence length. 53 | if eff == "shortest": 54 | reflen = min(reflen) 55 | elif eff == "average": 56 | reflen = float(sum(reflen))/len(reflen) 57 | 58 | ## lhuang: N.B.: leave reflen computaiton to the very end!! 59 | 60 | ## lhuang: N.B.: in case of "closest", keep a list of reflens!! (bad design) 61 | 62 | return (reflen, maxcounts) 63 | 64 | def cook_test(test, s, eff=None, n=4): 65 | '''Takes a test sentence and returns an object that 66 | encapsulates everything that BLEU needs to know about it.''' 67 | 68 | reflen, refmaxcounts = s 69 | 70 | testlen, counts = precook(test, n, True) 71 | 72 | result = {} 73 | 74 | # Calculate effective reference sentence length. 75 | 76 | if eff == "closest": 77 | result["reflen"] = min((abs(l-testlen), l) for l in reflen)[1] 78 | else: ## i.e., "average" or "shortest" or None 79 | result["reflen"] = reflen 80 | 81 | result["testlen"] = testlen 82 | 83 | result["guess"] = [max(0,testlen-k+1) for k in range(1,n+1)] 84 | 85 | result['correct'] = [0]*n 86 | for (ngram, count) in counts.items(): 87 | result["correct"][len(ngram)-1] += min(refmaxcounts.get(ngram,0), count) 88 | 89 | return result 90 | 91 | class BleuScorer(object): 92 | """Bleu scorer. 93 | """ 94 | 95 | __slots__ = "n", "crefs", "ctest", "_score", "_ratio", "_testlen", "_reflen", "special_reflen" 96 | # special_reflen is used in oracle (proportional effective ref len for a node). 97 | 98 | def copy(self): 99 | ''' copy the refs.''' 100 | new = BleuScorer(n=self.n) 101 | new.ctest = copy.copy(self.ctest) 102 | new.crefs = copy.copy(self.crefs) 103 | new._score = None 104 | return new 105 | 106 | def __init__(self, test=None, refs=None, n=4, special_reflen=None): 107 | ''' singular instance ''' 108 | 109 | self.n = n 110 | self.crefs = [] 111 | self.ctest = [] 112 | self.cook_append(test, refs) 113 | self.special_reflen = special_reflen 114 | 115 | def cook_append(self, test, refs): 116 | '''called by constructor and __iadd__ to avoid creating new instances.''' 117 | 118 | if refs is not None: 119 | self.crefs.append(cook_refs(refs)) 120 | if test is not None: 121 | cooked_test = cook_test(test, self.crefs[-1]) 122 | self.ctest.append(cooked_test) ## N.B.: -1 123 | else: 124 | self.ctest.append(None) # lens of crefs and ctest have to match 125 | 126 | self._score = None ## need to recompute 127 | 128 | def ratio(self, option=None): 129 | self.compute_score(option=option) 130 | return self._ratio 131 | 132 | def score_ratio(self, option=None): 133 | '''return (bleu, len_ratio) pair''' 134 | return (self.fscore(option=option), self.ratio(option=option)) 135 | 136 | def score_ratio_str(self, option=None): 137 | return "%.4f (%.2f)" % self.score_ratio(option) 138 | 139 | def reflen(self, option=None): 140 | self.compute_score(option=option) 141 | return self._reflen 142 | 143 | def testlen(self, option=None): 144 | self.compute_score(option=option) 145 | return self._testlen 146 | 147 | def retest(self, new_test): 148 | if type(new_test) is str: 149 | new_test = [new_test] 150 | assert len(new_test) == len(self.crefs), new_test 151 | self.ctest = [] 152 | for t, rs in zip(new_test, self.crefs): 153 | self.ctest.append(cook_test(t, rs)) 154 | self._score = None 155 | 156 | return self 157 | 158 | def rescore(self, new_test): 159 | ''' replace test(s) with new test(s), and returns the new score.''' 160 | 161 | return self.retest(new_test).compute_score() 162 | 163 | def size(self): 164 | assert len(self.crefs) == len(self.ctest), "refs/test mismatch! %d<>%d" % (len(self.crefs), len(self.ctest)) 165 | return len(self.crefs) 166 | 167 | def __iadd__(self, other): 168 | '''add an instance (e.g., from another sentence).''' 169 | 170 | if type(other) is tuple: 171 | ## avoid creating new BleuScorer instances 172 | self.cook_append(other[0], other[1]) 173 | else: 174 | assert self.compatible(other), "incompatible BLEUs." 175 | self.ctest.extend(other.ctest) 176 | self.crefs.extend(other.crefs) 177 | self._score = None ## need to recompute 178 | 179 | return self 180 | 181 | def compatible(self, other): 182 | return isinstance(other, BleuScorer) and self.n == other.n 183 | 184 | def single_reflen(self, option="average"): 185 | return self._single_reflen(self.crefs[0][0], option) 186 | 187 | def _single_reflen(self, reflens, option=None, testlen=None): 188 | 189 | if option == "shortest": 190 | reflen = min(reflens) 191 | elif option == "average": 192 | reflen = float(sum(reflens))/len(reflens) 193 | elif option == "closest": 194 | reflen = min((abs(l-testlen), l) for l in reflens)[1] 195 | else: 196 | assert False, "unsupported reflen option %s" % option 197 | 198 | return reflen 199 | 200 | def recompute_score(self, option=None, verbose=0): 201 | self._score = None 202 | return self.compute_score(option, verbose) 203 | 204 | def compute_score(self, option=None, verbose=0): 205 | n = self.n 206 | small = 1e-9 207 | tiny = 1e-15 ## so that if guess is 0 still return 0 208 | bleu_list = [[] for _ in range(n)] 209 | 210 | if self._score is not None: 211 | return self._score 212 | 213 | if option is None: 214 | option = "average" if len(self.crefs) == 1 else "closest" 215 | 216 | self._testlen = 0 217 | self._reflen = 0 218 | totalcomps = {'testlen':0, 'reflen':0, 'guess':[0]*n, 'correct':[0]*n} 219 | 220 | # for each sentence 221 | for comps in self.ctest: 222 | testlen = comps['testlen'] 223 | self._testlen += testlen 224 | 225 | if self.special_reflen is None: ## need computation 226 | reflen = self._single_reflen(comps['reflen'], option, testlen) 227 | else: 228 | reflen = self.special_reflen 229 | 230 | self._reflen += reflen 231 | 232 | for key in ['guess','correct']: 233 | for k in range(n): 234 | totalcomps[key][k] += comps[key][k] 235 | 236 | # append per image bleu score 237 | bleu = 1. 238 | for k in range(n): 239 | bleu *= (float(comps['correct'][k]) + tiny) \ 240 | /(float(comps['guess'][k]) + small) 241 | bleu_list[k].append(bleu ** (1./(k+1))) 242 | ratio = (testlen + tiny) / (reflen + small) ## N.B.: avoid zero division 243 | if ratio < 1: 244 | for k in range(n): 245 | bleu_list[k][-1] *= math.exp(1 - 1/ratio) 246 | 247 | if verbose > 1: 248 | print(comps, reflen) 249 | 250 | totalcomps['reflen'] = self._reflen 251 | totalcomps['testlen'] = self._testlen 252 | 253 | bleus = [] 254 | bleu = 1. 255 | for k in range(n): 256 | bleu *= float(totalcomps['correct'][k] + tiny) \ 257 | / (totalcomps['guess'][k] + small) 258 | bleus.append(bleu ** (1./(k+1))) 259 | ratio = (self._testlen + tiny) / (self._reflen + small) ## N.B.: avoid zero division 260 | if ratio < 1: 261 | for k in range(n): 262 | bleus[k] *= math.exp(1 - 1/ratio) 263 | 264 | if verbose > 0: 265 | print(totalcomps) 266 | print("ratio:", ratio) 267 | 268 | self._score = bleus 269 | return self._score, bleu_list 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | class Bleu: 287 | def __init__(self, n=4): 288 | # default compute Blue score up to 4 289 | self._n = n 290 | self._hypo_for_image = {} 291 | self.ref_for_image = {} 292 | 293 | def compute_score(self, gts, res): 294 | 295 | assert(gts.keys() == res.keys()) 296 | imgIds = gts.keys() 297 | 298 | bleu_scorer = BleuScorer(n=self._n) 299 | for id in imgIds: 300 | hypo = res[id] 301 | ref = gts[id] 302 | 303 | # Sanity check. 304 | assert(type(hypo) is list) 305 | assert(len(hypo) == 1) 306 | assert(type(ref) is list) 307 | assert(len(ref) >= 1) 308 | 309 | bleu_scorer += (hypo[0], ref) 310 | 311 | #score, scores = bleu_scorer.compute_score(option='shortest') 312 | score, scores = bleu_scorer.compute_score(option='closest', verbose=1) 313 | #score, scores = bleu_scorer.compute_score(option='average', verbose=1) 314 | 315 | # return (bleu, bleu_info) 316 | return score, scores 317 | 318 | def method(self): 319 | return "Bleu" 320 | -------------------------------------------------------------------------------- /resources/bleu_scorer.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # bleu_scorer.py 4 | # David Chiang 5 | 6 | # Copyright (c) 2004-2006 University of Maryland. All rights 7 | # reserved. Do not redistribute without permission from the 8 | # author. Not for commercial use. 9 | 10 | # Modified by: 11 | # Hao Fang 12 | # Tsung-Yi Lin 13 | 14 | '''Provides: 15 | cook_refs(refs, n=4): Transform a list of reference sentences as strings into a form usable by cook_test(). 16 | cook_test(test, refs, n=4): Transform a test sentence as a string (together with the cooked reference sentences) into a form usable by score_cooked(). 17 | ''' 18 | 19 | import copy 20 | import sys, math, re 21 | from collections import defaultdict 22 | 23 | def precook(s, n=4, out=False): 24 | """Takes a string as input and returns an object that can be given to 25 | either cook_refs or cook_test. This is optional: cook_refs and cook_test 26 | can take string arguments as well.""" 27 | words = s.split() 28 | counts = defaultdict(int) 29 | for k in range(1,n+1): 30 | for i in range(len(words)-k+1): 31 | ngram = tuple(words[i:i+k]) 32 | counts[ngram] += 1 33 | return (len(words), counts) 34 | 35 | def cook_refs(refs, eff=None, n=4): ## lhuang: oracle will call with "average" 36 | '''Takes a list of reference sentences for a single segment 37 | and returns an object that encapsulates everything that BLEU 38 | needs to know about them.''' 39 | 40 | reflen = [] 41 | maxcounts = {} 42 | for ref in refs: 43 | rl, counts = precook(ref, n) 44 | reflen.append(rl) 45 | for (ngram,count) in counts.items(): 46 | maxcounts[ngram] = max(maxcounts.get(ngram,0), count) 47 | 48 | # Calculate effective reference sentence length. 49 | if eff == "shortest": 50 | reflen = min(reflen) 51 | elif eff == "average": 52 | reflen = float(sum(reflen))/len(reflen) 53 | 54 | ## lhuang: N.B.: leave reflen computaiton to the very end!! 55 | 56 | ## lhuang: N.B.: in case of "closest", keep a list of reflens!! (bad design) 57 | 58 | return (reflen, maxcounts) 59 | 60 | def cook_test(test, s, eff=None, n=4): 61 | '''Takes a test sentence and returns an object that 62 | encapsulates everything that BLEU needs to know about it.''' 63 | 64 | reflen, refmaxcounts = s 65 | 66 | testlen, counts = precook(test, n, True) 67 | 68 | result = {} 69 | 70 | # Calculate effective reference sentence length. 71 | 72 | if eff == "closest": 73 | result["reflen"] = min((abs(l-testlen), l) for l in reflen)[1] 74 | else: ## i.e., "average" or "shortest" or None 75 | result["reflen"] = reflen 76 | 77 | result["testlen"] = testlen 78 | 79 | result["guess"] = [max(0,testlen-k+1) for k in range(1,n+1)] 80 | 81 | result['correct'] = [0]*n 82 | for (ngram, count) in counts.items(): 83 | result["correct"][len(ngram)-1] += min(refmaxcounts.get(ngram,0), count) 84 | 85 | return result 86 | 87 | class BleuScorer(object): 88 | """Bleu scorer. 89 | """ 90 | 91 | __slots__ = "n", "crefs", "ctest", "_score", "_ratio", "_testlen", "_reflen", "special_reflen" 92 | # special_reflen is used in oracle (proportional effective ref len for a node). 93 | 94 | def copy(self): 95 | ''' copy the refs.''' 96 | new = BleuScorer(n=self.n) 97 | new.ctest = copy.copy(self.ctest) 98 | new.crefs = copy.copy(self.crefs) 99 | new._score = None 100 | return new 101 | 102 | def __init__(self, test=None, refs=None, n=4, special_reflen=None): 103 | ''' singular instance ''' 104 | 105 | self.n = n 106 | self.crefs = [] 107 | self.ctest = [] 108 | self.cook_append(test, refs) 109 | self.special_reflen = special_reflen 110 | 111 | def cook_append(self, test, refs): 112 | '''called by constructor and __iadd__ to avoid creating new instances.''' 113 | 114 | if refs is not None: 115 | self.crefs.append(cook_refs(refs)) 116 | if test is not None: 117 | cooked_test = cook_test(test, self.crefs[-1]) 118 | self.ctest.append(cooked_test) ## N.B.: -1 119 | else: 120 | self.ctest.append(None) # lens of crefs and ctest have to match 121 | 122 | self._score = None ## need to recompute 123 | 124 | def ratio(self, option=None): 125 | self.compute_score(option=option) 126 | return self._ratio 127 | 128 | def score_ratio(self, option=None): 129 | '''return (bleu, len_ratio) pair''' 130 | return (self.fscore(option=option), self.ratio(option=option)) 131 | 132 | def score_ratio_str(self, option=None): 133 | return "%.4f (%.2f)" % self.score_ratio(option) 134 | 135 | def reflen(self, option=None): 136 | self.compute_score(option=option) 137 | return self._reflen 138 | 139 | def testlen(self, option=None): 140 | self.compute_score(option=option) 141 | return self._testlen 142 | 143 | def retest(self, new_test): 144 | if type(new_test) is str: 145 | new_test = [new_test] 146 | assert len(new_test) == len(self.crefs), new_test 147 | self.ctest = [] 148 | for t, rs in zip(new_test, self.crefs): 149 | self.ctest.append(cook_test(t, rs)) 150 | self._score = None 151 | 152 | return self 153 | 154 | def rescore(self, new_test): 155 | ''' replace test(s) with new test(s), and returns the new score.''' 156 | 157 | return self.retest(new_test).compute_score() 158 | 159 | def size(self): 160 | assert len(self.crefs) == len(self.ctest), "refs/test mismatch! %d<>%d" % (len(self.crefs), len(self.ctest)) 161 | return len(self.crefs) 162 | 163 | def __iadd__(self, other): 164 | '''add an instance (e.g., from another sentence).''' 165 | 166 | if type(other) is tuple: 167 | ## avoid creating new BleuScorer instances 168 | self.cook_append(other[0], other[1]) 169 | else: 170 | assert self.compatible(other), "incompatible BLEUs." 171 | self.ctest.extend(other.ctest) 172 | self.crefs.extend(other.crefs) 173 | self._score = None ## need to recompute 174 | 175 | return self 176 | 177 | def compatible(self, other): 178 | return isinstance(other, BleuScorer) and self.n == other.n 179 | 180 | def single_reflen(self, option="average"): 181 | return self._single_reflen(self.crefs[0][0], option) 182 | 183 | def _single_reflen(self, reflens, option=None, testlen=None): 184 | 185 | if option == "shortest": 186 | reflen = min(reflens) 187 | elif option == "average": 188 | reflen = float(sum(reflens))/len(reflens) 189 | elif option == "closest": 190 | reflen = min((abs(l-testlen), l) for l in reflens)[1] 191 | else: 192 | assert False, "unsupported reflen option %s" % option 193 | 194 | return reflen 195 | 196 | def recompute_score(self, option=None, verbose=0): 197 | self._score = None 198 | return self.compute_score(option, verbose) 199 | 200 | def compute_score(self, option=None, verbose=0): 201 | n = self.n 202 | small = 1e-9 203 | tiny = 1e-15 ## so that if guess is 0 still return 0 204 | bleu_list = [[] for _ in range(n)] 205 | 206 | if self._score is not None: 207 | return self._score 208 | 209 | if option is None: 210 | option = "average" if len(self.crefs) == 1 else "closest" 211 | 212 | self._testlen = 0 213 | self._reflen = 0 214 | totalcomps = {'testlen':0, 'reflen':0, 'guess':[0]*n, 'correct':[0]*n} 215 | 216 | # for each sentence 217 | for comps in self.ctest: 218 | testlen = comps['testlen'] 219 | self._testlen += testlen 220 | 221 | if self.special_reflen is None: ## need computation 222 | reflen = self._single_reflen(comps['reflen'], option, testlen) 223 | else: 224 | reflen = self.special_reflen 225 | 226 | self._reflen += reflen 227 | 228 | for key in ['guess','correct']: 229 | for k in range(n): 230 | totalcomps[key][k] += comps[key][k] 231 | 232 | # append per image bleu score 233 | bleu = 1. 234 | for k in range(n): 235 | bleu *= (float(comps['correct'][k]) + tiny) \ 236 | /(float(comps['guess'][k]) + small) 237 | bleu_list[k].append(bleu ** (1./(k+1))) 238 | ratio = (testlen + tiny) / (reflen + small) ## N.B.: avoid zero division 239 | if ratio < 1: 240 | for k in range(n): 241 | bleu_list[k][-1] *= math.exp(1 - 1/ratio) 242 | 243 | if verbose > 1: 244 | print(comps, reflen) 245 | 246 | totalcomps['reflen'] = self._reflen 247 | totalcomps['testlen'] = self._testlen 248 | 249 | bleus = [] 250 | bleu = 1. 251 | for k in range(n): 252 | bleu *= float(totalcomps['correct'][k] + tiny) \ 253 | / (totalcomps['guess'][k] + small) 254 | bleus.append(bleu ** (1./(k+1))) 255 | ratio = (self._testlen + tiny) / (self._reflen + small) ## N.B.: avoid zero division 256 | if ratio < 1: 257 | for k in range(n): 258 | bleus[k] *= math.exp(1 - 1/ratio) 259 | 260 | if verbose > 0: 261 | print(totalcomps) 262 | print("ratio:", ratio) 263 | 264 | self._score = bleus 265 | return self._score, bleu_list 266 | --------------------------------------------------------------------------------