├── .gitignore ├── Data Cleaning.ipynb ├── DeepFake_Detectcion_Models.ipynb ├── ImageNet Models.ipynb ├── README.md ├── deepfake.gif ├── figs ├── Custom CNN History.png ├── Custom CNN.png ├── Transfer Learning CNN History.png ├── Transfer Learning CNN.png ├── Transfer Learning TD CNN+RNN.png └── n_frames_hist.png ├── get_dataset_size.sh ├── get_n_frames.sh ├── n_frame_outliers.txt ├── reduce_frames.sh ├── train_test_directories.sh ├── unzip_batch.sh └── zero_pad_file.sh /.gitignore: -------------------------------------------------------------------------------- 1 | /data/* 2 | /data2/* 3 | /data_30/* 4 | /test_dir/* 5 | /train/* 6 | /test/* 7 | -------------------------------------------------------------------------------- /Data Cleaning.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Data Cleaning" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "---" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 3, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "import numpy as np\n", 24 | "import pandas as pd\n", 25 | "import imageio\n", 26 | "#import seaborn as sns" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 4, 32 | "metadata": {}, 33 | "outputs": [ 34 | { 35 | "name": "stdout", 36 | "output_type": "stream", 37 | "text": [ 38 | "(10420, 4)\n" 39 | ] 40 | }, 41 | { 42 | "data": { 43 | "text/html": [ 44 | "
\n", 45 | "\n", 58 | "\n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | "
filenamesplitoriginallabel
0bztdemptfg.mp4trainexxqlfpnbz.mp4FAKE
1qarqtkvgby.mp4trainNaNREAL
2kujvvxpted.mp4trainfdpisghkmd.mp4FAKE
3avznxuwvbx.mp4traindpevefkefv.mp4FAKE
4ehfmarmsvo.mp4trainjawgcggquk.mp4FAKE
\n", 106 | "
" 107 | ], 108 | "text/plain": [ 109 | " filename split original label\n", 110 | "0 bztdemptfg.mp4 train exxqlfpnbz.mp4 FAKE\n", 111 | "1 qarqtkvgby.mp4 train NaN REAL\n", 112 | "2 kujvvxpted.mp4 train fdpisghkmd.mp4 FAKE\n", 113 | "3 avznxuwvbx.mp4 train dpevefkefv.mp4 FAKE\n", 114 | "4 ehfmarmsvo.mp4 train jawgcggquk.mp4 FAKE" 115 | ] 116 | }, 117 | "execution_count": 4, 118 | "metadata": {}, 119 | "output_type": "execute_result" 120 | } 121 | ], 122 | "source": [ 123 | "metadata = pd.read_csv(\"data/metadata.csv\")\n", 124 | "print(metadata.shape)\n", 125 | "metadata.head()" 126 | ] 127 | }, 128 | { 129 | "cell_type": "code", 130 | "execution_count": 5, 131 | "metadata": {}, 132 | "outputs": [ 133 | { 134 | "name": "stdout", 135 | "output_type": "stream", 136 | "text": [ 137 | "FAKE 0.88618\n", 138 | "REAL 0.11382\n", 139 | "Name: label, dtype: float64\n" 140 | ] 141 | } 142 | ], 143 | "source": [ 144 | "# class distribution of dataset\n", 145 | "print(metadata['label'].value_counts() / metadata['label'].value_counts().sum())" 146 | ] 147 | }, 148 | { 149 | "cell_type": "markdown", 150 | "metadata": {}, 151 | "source": [ 152 | "The dataset has a pretty imbalanced class distribution of ~89% fakes and ~11% real videos." 153 | ] 154 | }, 155 | { 156 | "cell_type": "code", 157 | "execution_count": 4, 158 | "metadata": {}, 159 | "outputs": [], 160 | "source": [ 161 | "# remove unneeded column\n", 162 | "metadata.drop('split', axis = 1, inplace=True)" 163 | ] 164 | }, 165 | { 166 | "cell_type": "markdown", 167 | "metadata": {}, 168 | "source": [ 169 | "Based on the original dataset comprising of videos that are all 10 seconds long at 30 frames per second (FPS), I should expect the pre-processed dataset to consist of 300 images or frames of faces for each video. From browsing the pre-processed data, I encountered cases where frames misidentified as faces were present and cases with more than 1 face per frame (video featured more than 1 actor). I thus sought to investigate the number of frames across the whole dataset. Video filenames and their number of frames was obtained using a bash script (get_n_frames.sh) and written into a csv file (n_frames_df.csv)." 170 | ] 171 | }, 172 | { 173 | "cell_type": "code", 174 | "execution_count": 3, 175 | "metadata": {}, 176 | "outputs": [ 177 | { 178 | "data": { 179 | "text/html": [ 180 | "
\n", 181 | "\n", 194 | "\n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | "
filenamen_frames
0data/aaagqkcdis/276
1data/aaaoqepxnf/300
2data/aabdnomlru/300
3data/aabqyygbaa/300
4data/aafezqchru/300
\n", 230 | "
" 231 | ], 232 | "text/plain": [ 233 | " filename n_frames\n", 234 | "0 data/aaagqkcdis/ 276\n", 235 | "1 data/aaaoqepxnf/ 300\n", 236 | "2 data/aabdnomlru/ 300\n", 237 | "3 data/aabqyygbaa/ 300\n", 238 | "4 data/aafezqchru/ 300" 239 | ] 240 | }, 241 | "execution_count": 3, 242 | "metadata": {}, 243 | "output_type": "execute_result" 244 | } 245 | ], 246 | "source": [ 247 | "n_frames_df = pd.read_csv(\"n_frames.csv\", names=['filename', 'n_frames'])\n", 248 | "n_frames_df.head()" 249 | ] 250 | }, 251 | { 252 | "cell_type": "code", 253 | "execution_count": 21, 254 | "metadata": {}, 255 | "outputs": [ 256 | { 257 | "data": { 258 | "image/png": "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\n", 259 | "text/plain": [ 260 | "
" 261 | ] 262 | }, 263 | "metadata": { 264 | "needs_background": "light" 265 | }, 266 | "output_type": "display_data" 267 | } 268 | ], 269 | "source": [ 270 | "# look at the distribution of n frames in a density plot\n", 271 | "ax = sns.distplot(n_frames_df['n_frames'], hist=False)\n", 272 | "ax.set_xlabel('Number of Frames', fontsize = 16)\n", 273 | "ax.set_ylabel('Density', fontsize = 16)\n", 274 | "ax.tick_params(labelsize=12)" 275 | ] 276 | }, 277 | { 278 | "cell_type": "code", 279 | "execution_count": 24, 280 | "metadata": {}, 281 | "outputs": [], 282 | "source": [ 283 | "# write histogram as png\n", 284 | "n_frames_hist = ax.get_figure()\n", 285 | "n_frames_hist.savefig('figs/n_frames_hist.png')" 286 | ] 287 | }, 288 | { 289 | "cell_type": "markdown", 290 | "metadata": {}, 291 | "source": [ 292 | "There is some variability in the number of frames that were extracted from each video, with the majority of extracted frames falling between 200 and 400. There is also a noticeable group around 600 frames - these must be the videos that featured 2 actors. \n", 293 | "\n", 294 | "Since I will be using keras models which takes a non-variable input shape, I need all of my videos to have the same number of frames. I also need to consider whether 30 frames per second is necessary, as adjacent frames will be nearly identical. Considering my limited resources in time and computation, reducing down to 1 frame per second sounds like a reasonable idea. This also reduces the amount of padding I would need to do. First, I will disregard videos for which less than 200 or more than 400 face frames were extracted (outliers). " 295 | ] 296 | }, 297 | { 298 | "cell_type": "code", 299 | "execution_count": 4, 300 | "metadata": {}, 301 | "outputs": [], 302 | "source": [ 303 | "# remove extraneous characters from filename\n", 304 | "n_frames_df['filename'] = n_frames_df['filename'].str.replace(\"data/\", \"\").str.replace(\"/\", \"\")" 305 | ] 306 | }, 307 | { 308 | "cell_type": "code", 309 | "execution_count": 5, 310 | "metadata": {}, 311 | "outputs": [ 312 | { 313 | "data": { 314 | "text/plain": [ 315 | "1832" 316 | ] 317 | }, 318 | "execution_count": 5, 319 | "metadata": {}, 320 | "output_type": "execute_result" 321 | } 322 | ], 323 | "source": [ 324 | "# get videos for which over 400 or less than 200 frames were extracted during face detection\n", 325 | "outliers = n_frames_df.loc[np.where((n_frames_df['n_frames']>400) | (n_frames_df['n_frames']<200))]['filename']\n", 326 | "len(outliers)" 327 | ] 328 | }, 329 | { 330 | "cell_type": "markdown", 331 | "metadata": {}, 332 | "source": [ 333 | "Recall that for each original video, several fakes were generated. So, if a real video was identified as an outlier but one or more of its derived fakes were not, those fakes would no longer have an associated original in the dataset. Let's check to see if there are any of these cases." 334 | ] 335 | }, 336 | { 337 | "cell_type": "code", 338 | "execution_count": 6, 339 | "metadata": {}, 340 | "outputs": [ 341 | { 342 | "data": { 343 | "text/plain": [ 344 | "51" 345 | ] 346 | }, 347 | "execution_count": 6, 348 | "metadata": {}, 349 | "output_type": "execute_result" 350 | } 351 | ], 352 | "source": [ 353 | "# get fakes associated with a real video that was called as an outlier\n", 354 | "real_outlier_fakes = metadata[metadata['original'].isin(outliers + \".mp4\")]['filename']\n", 355 | "\n", 356 | "# from above, get those that were not called an outlier\n", 357 | "outlier_assoc_fakes = real_outlier_fakes[~real_outlier_fakes.isin(outliers + \".mp4\")].str.replace(\".mp4\", \"\")\n", 358 | "\n", 359 | "# how many were not called an outlier\n", 360 | "len(outlier_assoc_fakes)" 361 | ] 362 | }, 363 | { 364 | "cell_type": "markdown", 365 | "metadata": {}, 366 | "source": [ 367 | "There are 51 non-outlier fakes whose associated originals were idenfied to be an outlier. Let's add these to the outlier list." 368 | ] 369 | }, 370 | { 371 | "cell_type": "code", 372 | "execution_count": 7, 373 | "metadata": {}, 374 | "outputs": [], 375 | "source": [ 376 | "outliers = outliers.append(outlier_assoc_fakes)" 377 | ] 378 | }, 379 | { 380 | "cell_type": "code", 381 | "execution_count": 122, 382 | "metadata": {}, 383 | "outputs": [], 384 | "source": [ 385 | "# write outlier filenames as txt file\n", 386 | "outlier_paths = \"data/\" + outliers\n", 387 | "outlier_paths.to_csv('n_frame_outliers.txt', index=0, header=False)" 388 | ] 389 | }, 390 | { 391 | "cell_type": "markdown", 392 | "metadata": {}, 393 | "source": [ 394 | "Using the exported n_frame_outliers.txt file, I archived the outliers video directories with the following bash command:\n", 395 | "\n", 396 | "`xargs -a n_frame_outliers.txt mv -t data/archived/n_frame_outliers`\n", 397 | "\n", 398 | "Can return an error: `mv: cannot stat ''$'\\r': No such file or directory`\n", 399 | "Had to run the following for the bash command to work\n", 400 | "\n", 401 | "`tr -d '\\r' n_frame_outliers_new.txt && mv n_frame_outliers_new.txt n_frame_outliers.txt`" 402 | ] 403 | }, 404 | { 405 | "cell_type": "markdown", 406 | "metadata": {}, 407 | "source": [ 408 | "I should also update the metadata file" 409 | ] 410 | }, 411 | { 412 | "cell_type": "code", 413 | "execution_count": 8, 414 | "metadata": {}, 415 | "outputs": [], 416 | "source": [ 417 | "# fill na values in original with value in filename (only relevant for real videos)\n", 418 | "metadata['original'].fillna(metadata['filename'], inplace=True)\n", 419 | "\n", 420 | "# remove '.mp4' from filename\n", 421 | "metadata['filename'] = metadata['filename'].str.replace('.mp4', '')\n", 422 | "\n", 423 | "# remove outliers\n", 424 | "metadata = metadata[~metadata['filename'].isin(outliers)]\n", 425 | "\n", 426 | "# change filename to be path to each image folder\n", 427 | "metadata['filename'] = 'data_30/' + metadata['filename']\n", 428 | "\n", 429 | "# encode labels as 0 (real) and 1 (fake)\n", 430 | "metadata['label'] = metadata['label'].map({'REAL':0, 'FAKE':1})" 431 | ] 432 | }, 433 | { 434 | "cell_type": "code", 435 | "execution_count": 9, 436 | "metadata": {}, 437 | "outputs": [ 438 | { 439 | "data": { 440 | "text/plain": [ 441 | "(8537, 4)" 442 | ] 443 | }, 444 | "execution_count": 9, 445 | "metadata": {}, 446 | "output_type": "execute_result" 447 | } 448 | ], 449 | "source": [ 450 | "metadata.shape" 451 | ] 452 | }, 453 | { 454 | "cell_type": "code", 455 | "execution_count": 10, 456 | "metadata": {}, 457 | "outputs": [ 458 | { 459 | "data": { 460 | "text/plain": [ 461 | "1 0.877826\n", 462 | "0 0.122174\n", 463 | "Name: label, dtype: float64" 464 | ] 465 | }, 466 | "execution_count": 10, 467 | "metadata": {}, 468 | "output_type": "execute_result" 469 | } 470 | ], 471 | "source": [ 472 | "# return proportion of classes\n", 473 | "metadata['label'].value_counts() / metadata['label'].value_counts().sum()" 474 | ] 475 | }, 476 | { 477 | "cell_type": "markdown", 478 | "metadata": {}, 479 | "source": [ 480 | "The dataset consists of ~87.8% fake videos and ~12.2% real videos. This means that a model requires an accuracy of greater than 87.8% to be better than just simply guessing 'fake' on every video." 481 | ] 482 | }, 483 | { 484 | "cell_type": "markdown", 485 | "metadata": {}, 486 | "source": [ 487 | "## Train-Test Split" 488 | ] 489 | }, 490 | { 491 | "cell_type": "markdown", 492 | "metadata": {}, 493 | "source": [ 494 | "The fact that there are multiple fake videos derived from each original video presents a concern regarding the train-test split. If I were to perform random stratification, videos derived from the same original would be present in both training and testing sets, thus breaking the *golden rule* of machine learning. To elaborate, while no two videos should be exactly the same, the similarity between videos orignating from the same source may bias the model such that it may be able to classify a video more easily if it has learned from related videos during training. Hence, I should ensure that each original and their derivatives or 'family' of videos are stratified such that they are mutually exclusive between the train and test sets." 495 | ] 496 | }, 497 | { 498 | "cell_type": "code", 499 | "execution_count": 11, 500 | "metadata": {}, 501 | "outputs": [], 502 | "source": [ 503 | "np.random.seed(2006)\n", 504 | "\n", 505 | "orig_files = metadata['original'].unique()\n", 506 | "\n", 507 | "# randomly split original (real) videos (20% test split)\n", 508 | "mask = np.random.rand(len(orig_files)) < 0.8\n", 509 | "train_mask = orig_files[mask]\n", 510 | "test_mask = orig_files[~mask]\n", 511 | "\n", 512 | "train = metadata[metadata['original'].isin(train_mask)]\n", 513 | "test = metadata[metadata['original'].isin(test_mask)]" 514 | ] 515 | }, 516 | { 517 | "cell_type": "code", 518 | "execution_count": 12, 519 | "metadata": {}, 520 | "outputs": [], 521 | "source": [ 522 | "# randomly split remaining 80% into train and validation\n", 523 | "train_files = train['original'].unique()\n", 524 | "\n", 525 | "mask = np.random.rand(len(train_files)) < 0.8\n", 526 | "train_mask = train_files[mask]\n", 527 | "validation_mask = train_files[~mask]\n", 528 | "\n", 529 | "train = metadata[metadata['original'].isin(train_mask)]\n", 530 | "validation = metadata[metadata['original'].isin(validation_mask)]" 531 | ] 532 | }, 533 | { 534 | "cell_type": "code", 535 | "execution_count": 13, 536 | "metadata": {}, 537 | "outputs": [ 538 | { 539 | "name": "stdout", 540 | "output_type": "stream", 541 | "text": [ 542 | "1 0.875739\n", 543 | "0 0.124261\n", 544 | "Name: label, dtype: float64\n", 545 | "1 0.876913\n", 546 | "0 0.123087\n", 547 | "Name: label, dtype: float64\n", 548 | "1 0.887283\n", 549 | "0 0.112717\n", 550 | "Name: label, dtype: float64\n" 551 | ] 552 | } 553 | ], 554 | "source": [ 555 | "# check class distribution in all sets\n", 556 | "print(train['label'].value_counts() / train['label'].value_counts().sum())\n", 557 | "print(test['label'].value_counts() / test['label'].value_counts().sum())\n", 558 | "print(validation['label'].value_counts() / validation['label'].value_counts().sum())" 559 | ] 560 | }, 561 | { 562 | "cell_type": "code", 563 | "execution_count": 8, 564 | "metadata": {}, 565 | "outputs": [], 566 | "source": [ 567 | "# drop 'original' column\n", 568 | "train.drop(['original'], axis = 1, inplace=True)\n", 569 | "validation.drop(['original'], axis = 1, inplace=True)\n", 570 | "test.drop(['original'], axis = 1, inplace=True)" 571 | ] 572 | }, 573 | { 574 | "cell_type": "code", 575 | "execution_count": 17, 576 | "metadata": {}, 577 | "outputs": [], 578 | "source": [ 579 | "# export metadata files for each set\n", 580 | "train.to_csv('metadata_train.csv', index=False)\n", 581 | "validation.to_csv('metadata_validation.csv', index=False)\n", 582 | "test.to_csv('metadata_test.csv', index=False)" 583 | ] 584 | } 585 | ], 586 | "metadata": { 587 | "kernelspec": { 588 | "display_name": "Python 3", 589 | "language": "python", 590 | "name": "python3" 591 | }, 592 | "language_info": { 593 | "codemirror_mode": { 594 | "name": "ipython", 595 | "version": 3 596 | }, 597 | "file_extension": ".py", 598 | "mimetype": "text/x-python", 599 | "name": "python", 600 | "nbconvert_exporter": "python", 601 | "pygments_lexer": "ipython3", 602 | "version": "3.6.10" 603 | } 604 | }, 605 | "nbformat": 4, 606 | "nbformat_minor": 4 607 | } 608 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # My BrainStation Capstone Project: Deep Learning for DeepFake Detection 2 | --- 3 | 4 | ### What are DeepFakes? 5 | 6 | Take a look at this GIF. Which one do you think is the original clip? 7 | 8 |

9 | 10 |
11 | Source 12 |

13 | 14 | Difficult, right? Especially if you don't know what movie this is from. Did you know this was generated by a computer? Well if you aren't aware, this is a **DeepFake**, an altered video produced by **Artificial Intelligence (AI)**. And it's not just limited to face swapping, any aspect of digital media is subject to 'DeepFaking' - a person's mouth movements can be adjusted to match any audio sample, for instance. It also takes a fraction of the time and cost to make DeepFakes than if a person were to produce the same results with CGI. This technology brings major implications to society; from spreading false information to fabricating evidence in court to sabotaging politics, it's not hard to imagine the many dangers of DeepFakes if left unchecked. Imagine if DeepFakes were to come out today of health officials and political figures saying that the Covid-19 pandemic is over, everyone can go out and socialize - the consequences would be disastrous! 15 | 16 | ### DeepFake Detection Challenge 17 | 18 | In an effort to curb the emerging threat of DeepFakes, a [**Kaggle competition**](https://www.kaggle.com/c/deepfake-detection-challenge/overview) was built in collaboration between Amazon, Facebook, Microsoft and Partnership on AI to invite enthusiasts of all backgrounds to compete for the best performing DeepFake detection model. As someone who loves challenging problems and has genuine concerns about DeepFakes, I chose to tackle this challenge for my capstone project. Over the course of ~7 weeks I performed an end-to-end Data Science workflow in which I obtained data, processed it and trained several deep learning models to differentiate between real and fake videos. To date, my best model achieved **96% precision** (of all predicted fakes, 96% were indeed fake) and **83% specificity** (able to correctly identify 83% of real videos) using just a single frame per video. Below summarizes the tools used for this project and the steps I took to get there! 19 | 20 | ## Resources 21 | --- 22 | 23 | ### Tools Used 24 | - Bash 25 | - Python 26 | - Github 27 | - Google Colab 28 | 29 | #### Python Packages: 30 | - **Data Science**: numpy, pandas 31 | - **Plotting**: matplotlib 32 | - **Machine Learning**: tensorflow version 2.1, keras 33 | - **Other**: jupyter, os, imageio, pickle, h5py 34 | 35 | ### Dataset 36 | 37 | The competition dataset consisted of close to 500 GB of videos, each with a length of 10 seconds at 30 frames per second (FPS). Due to computational and time limitations, I opted to use a pre-processed dataset which consisted of 160x160 resolution images of extracted faces from the original videos. Credits goes to *Hieu Phung* for generating this [**dataset**](https://www.kaggle.com/c/deepfake-detection-challenge/discussion/128954) - information about the pre-processing workflow can be found [**here**](https://www.kaggle.com/phunghieu/deepfake-detection-face-extractor). I also downloaded a subsample of the entire dataset, consisting of 10,420 videos (extracted frames). 38 | 39 | The dataset was split into several parts, with a zip file containing a variable number of folders with each containing a set of images pertaining to a unique video. Each zip file also came with a metadata.csv file which had the ids and labels of the associated 'videos'. Each data batch came in a zip file in the naming format of 'deepfake-detection-faces-part-i-j.zip' where 'i-j' refers to the batch number. I created a bash script *unzip_batch.sh* to unzip a zip file given a batch number and appropriately rename its associated metadata file with 'metadata_i-j.csv'. All metadata were consolidated into a single metadata file with this simple bash command: 40 | 41 | `cat data/metadata*.csv > data/metadata.csv` 42 | 43 | Important aspects of this dataset (relevance explained later): 44 | - Imbalanced classes: ~88% labeled **Fake**, ~12% labeled **Real** 45 | - Multiple fakes derived from each original 46 | 47 | ## Exploratory Data Analysis and Data Cleaning 48 | --- 49 | 50 | ### Filtering Based on Number of Frames 51 | 52 | Based on the original dataset comprising of videos that are all 10 seconds long at 30 FPS, I should expect the pre-processed dataset to consist of 300 images or frames of faces for each video. From browsing the pre-processed data, I encountered cases where frames misidentified as faces were present and cases with more than 1 face per frame (video featured more than 1 actor). I thus investigated the number of frames across the dataset. Video filenames and their number of frames was obtained using a bash script [**get_n_frames.sh**](https://github.com/sdlee94/BrainStation_Capstone/blob/master/get_n_frames.sh) and written into a csv file (**n_frames.csv**). The distribution of frame numbers was then plotted using Seaborn (see [notebook](https://github.com/sdlee94/BrainStation_Capstone/blob/master/Data%20Cleaning.ipynb)) 53 | 54 |

55 | 56 |
57 |

58 | 59 | > There is some variability in the number of frames that were extracted from each video, with the majority of extracted frames falling between 200 and 400. There is also a noticeable group around 600 frames - these must be the videos that featured 2 actors. 60 | 61 | Some explanations on why some videos had differing frame numbers are as follows: the ones with more frames had extra ones due to misidentified faces during pre-processing while the ones with less frames may had gaps in the video in which the actor's face was not detectable (e.g. actor may have turned their head or moved out of view) These factors can pose problems during classification since these extra frames or gaps would result in an inconsistent sequence of images. So I removed these 'outliers' and kept just the videos with between 200 and 400 frames since most of my data were within this range (see [notebook](https://github.com/sdlee94/BrainStation_Capstone/blob/master/Data%20Cleaning.ipynb)). Outlier names were exported as `n_frame_outliers.txt` and then used to move the matching directories into an archive folder: 62 | 63 | `xargs -a n_frame_outliers.txt mv -t data/archived/n_frame_outliers` 64 | 65 | > If the above returns `mv: cannot stat ''$'\r': No such file or directory`, run `tr -d '\r' n_frame_outliers_new.txt && mv n_frame_outliers_new.txt n_frame_outliers.txt` 66 | 67 | After this filtering steps, 8,537 videos remained in my dataset. 68 | 69 | ### Extracting 30 Frames per video 70 | 71 | Since I used keras models which takes a non-variable input shape, I needed all of my videos to have the same number of frames. I also considered whether 300 frames per second is necessary, since many frames were nearly identical. With my limited resources in time and computation, I rationalized that reducing down to 3 Frames per second (30 frames per video) was a reasonable idea. Using a [Bash script](https://github.com/sdlee94/BrainStation_Capstone/blob/master/reduce_frames.sh), I extracted every 10th frame per video up to 30 frames. I also skipped frames that had multiple 'faces' to avoid misidentified frames. 72 | 73 | ### Train-Validation-Test Split 74 | 75 | The fact that there are multiple fake videos derived from each original video presents a concern regarding the train-test split. If I were to perform random stratification, videos derived from the same original would be present in both training and validation/testing sets. This is an issue because the similarity between videos originating from the same source may bias the model such that it may be able to classify a video more easily if it has learned from related videos during training. Hence, I ensured that each original plus their derivatives were not separated during stratification. See [**here**](https://github.com/sdlee94/BrainStation_Capstone/blob/master/Data%20Cleaning.ipynb) for relevant code. 20% of my data (n=1,568) went into the test set, and the remaining were split 80/20 into the training (n=5,585) and validation (n=1,384) sets, respectively. 76 | 77 | ## Building Deep Learning Models for DeepFake detection 78 | --- 79 | 80 | Once all of the cleaning steps were done, I uploaded my data onto my Google Drive so that I could access it from Google Colab. Neural networks for DeepFake detection were made and trained in a [**Colab notebook**](https://colab.research.google.com/drive/1Ws04sKr2gqmCjVfiMg8DkubP0renW8OL#scrollTo=UnlVvKJFWgKo) with GPU as the runtime type. Models were trained for 50 epochs unless specified otherwise. **ModelCheckpoint** was also used to save the parameters that resulted in the best performance (lowest validation loss). 81 | 82 | ### Detection using a custom CNN with 1 Frame per Video 83 | 84 | To get a baseline performance, I first framed this as an image classification problem by training models on just the 15th frame (the middle frame) for each video. The first model I used was a custom **Convolutional Neural Network (CNN)** with a relatively simple architecture of 6 convolutional layers, 3 pooling layers and 2 dense layers (not including output): 85 | 86 |

87 | 88 |
89 |

90 | 91 | However, this model did not appear to be able to learn during training. As seen in the figure below, the training and validation loss remained static, at least for the first 20 epochs. The training and validation accuracy also did not appear to improve, the model appeared to flip between predicting everything as fake (~88% accuracy) or real (~12% accuracy) on the validation set. Adjusting the learning rate did not appear to change this tendency. 92 | 93 |

94 | 95 |
96 |

97 | 98 | This model performed with an ~88% accuracy on the test set, but with a specificity (proportion of correctly classified real videos) of zero. Again, this model predicted every test video as fake. Another negative indication was its **ROC AUC** score of 0.5 (equivalent to random guessing). I took this as a sign that I needed deeper and more complex models. So, I sought to apply **transfer learning** on pre-trained ImageNet models that are available in the Keras package. 99 | 100 | ### Detection using Transfer Learning with 1 Frame per Video 101 | 102 | Keras has several built-in deep learning models that have been trained on millions of images from the [ImageNet dataset](http://www.image-net.org/). To apply transfer learning, I imported these models and modified the input shape and output layer to conform to my data. I also appended two dense layers before the output layer so that these models could learn aspects about my data: 103 | 104 |

105 | 106 |
107 |

108 | 109 | I noticed that these models tended to show signs of overfitting. While the training loss and accuracy appeared to improve as training progressed, the validation loss and accuracy did not, as illustrated below. 110 | 111 |

112 | 113 |
114 |

115 | 116 | Still, these models were at least learning something. After trying several different built-in models, I was able to train one that achieved a **precision** of 0.96 (96% of predicted fakes were indeed fake) and a **specificity** of 0.83 (correctly identified 83% of real videos)! However, this came at the tradeoff of a high false negative rate or low recall of 0.58 (only 58% of fake videos were correctly identified). Moreover, the ROC AUC score was 0.71, indicating that there remained much room for improvement. 117 | 118 | ### Detection using Time Distributed CNN + Recurrent NN with 30 Frames per video 119 | 120 | Next step involves moving beyond image classification to video classification. For this, I apply the **Time Distribution** functionality around the built-in models and pass it to a **recurrent LSTM layer**: 121 | 122 |

123 | 124 |
125 |

126 | 127 | The idea here is that the convolutions are applied on each frame individually and then consolidated into the LSTM layers which takes into account the temporal sequence of the frames. However, with the time limit on free GPU usage on Google Colab, I could not train these models beyond 20 epochs. Of the few that I've tried training, signs of overfitting were evident as well - so far I did not obtain a model that outperformed my best one using 1 frame per video, adjustments to the recurrent layers or training for more epochs could help in the future. 128 | 129 | ## Concluding Remarks 130 | --- 131 | 132 | Considering the potentially enormous ramifications of malicious DeepFakes, my best performing model remains far from ideal. While false negatives (fakes misidentified as real) are perhaps more damaging than false positives (real videos misidentified as fake), minimization of both are incredibly important for the overarching goal of differentiating between authentic versus doctored media. [**Generative Adversarial Networks**](https://interestingengineering.com/generative-adversarial-networks-the-tech-behind-deepfake-and-faceapp) which are deep learning frameworks in which two networks (one for generating fakes and one for detection) compete against each other in a kind of evolutionary arms race, remain at the forefront of AI methodologies for DeepFake generation and detection. Future steps could explore GANs or other cutting edge AI frameworks to arrive at a more robust model. 133 | 134 | Questions? Reach out to me on [**LinkedIn**](https://www.linkedin.com/in/stephendongsoolee/) 135 | -------------------------------------------------------------------------------- /deepfake.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdlee94/DeepFake-Detection-Using-Neural-Networks/5314427c6d797b191efafa5b647f81fd4a0785a1/deepfake.gif -------------------------------------------------------------------------------- /figs/Custom CNN History.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdlee94/DeepFake-Detection-Using-Neural-Networks/5314427c6d797b191efafa5b647f81fd4a0785a1/figs/Custom CNN History.png -------------------------------------------------------------------------------- /figs/Custom CNN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdlee94/DeepFake-Detection-Using-Neural-Networks/5314427c6d797b191efafa5b647f81fd4a0785a1/figs/Custom CNN.png -------------------------------------------------------------------------------- /figs/Transfer Learning CNN History.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdlee94/DeepFake-Detection-Using-Neural-Networks/5314427c6d797b191efafa5b647f81fd4a0785a1/figs/Transfer Learning CNN History.png -------------------------------------------------------------------------------- /figs/Transfer Learning CNN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdlee94/DeepFake-Detection-Using-Neural-Networks/5314427c6d797b191efafa5b647f81fd4a0785a1/figs/Transfer Learning CNN.png -------------------------------------------------------------------------------- /figs/Transfer Learning TD CNN+RNN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdlee94/DeepFake-Detection-Using-Neural-Networks/5314427c6d797b191efafa5b647f81fd4a0785a1/figs/Transfer Learning TD CNN+RNN.png -------------------------------------------------------------------------------- /figs/n_frames_hist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sdlee94/DeepFake-Detection-Using-Neural-Networks/5314427c6d797b191efafa5b647f81fd4a0785a1/figs/n_frames_hist.png -------------------------------------------------------------------------------- /get_dataset_size.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # obtain number of directories (unique videos) in a directory ($1) 4 | ls -l $1 | grep -E -v "metadata|\.zip" | wc -l 5 | -------------------------------------------------------------------------------- /get_n_frames.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | for dir in data/*/; do \ 4 | length=$(ls -f $dir/* | wc -l); # ls -f to turn off sorting (save runtime) 5 | echo $dir, $length >> n_frames.csv; 6 | echo $dir; 7 | done 8 | -------------------------------------------------------------------------------- /n_frame_outliers.txt: -------------------------------------------------------------------------------- 1 | data/aahncigwte 2 | data/aansscoqsl 3 | data/abjgxazkfk 4 | data/abterabwrj 5 | data/abzamapbpi 6 | data/acazlolrpz 7 | data/adwtqjusqx 8 | data/aefblqbblo 9 | data/aejroilouc 10 | data/aekcmnblby 11 | data/aeydatwurh 12 | data/afkfweamui 13 | data/afkyiunrcp 14 | data/afnhmtuuva 15 | data/agjxxuumuk 16 | data/agotmizucf 17 | data/ahhciegkde 18 | data/ahkmridxqn 19 | data/ahmtzpethi 20 | data/aibtlxfhqi 21 | data/aiseiufjsz 22 | data/ajazlwhecq 23 | data/ajiyrjfyzp 24 | data/ajvkjkmhlw 25 | data/aklyvmtbnz 26 | data/akrebrefnz 27 | data/aktsnujuse 28 | data/akzoyfpvfd 29 | data/aljjmeqszq 30 | data/alrogmblmz 31 | data/alynbvvaar 32 | data/alzqhxzuoe 33 | data/amdtapdkzk 34 | data/amewrciygw 35 | data/amqaearxwx 36 | data/anfoyjmwoz 37 | data/anijlxqwza 38 | data/anjgxkikea 39 | data/anklylpjpm 40 | data/aoallgteyc 41 | data/apahohbfek 42 | data/apttmhpmps 43 | data/apzlacqgnz 44 | data/aqgocqgpqp 45 | data/aqoeyjsnzr 46 | data/arafzhoqil 47 | data/araoplrpeb 48 | data/arbljycfpx 49 | data/arelembybp 50 | data/arfxxftkqg 51 | data/arjvscherh 52 | data/arrfbwpasm 53 | data/arvqhnzltg 54 | data/arzcgyecpy 55 | data/aslizdtstq 56 | data/asmvgulrof 57 | data/asnnogwqkh 58 | data/atophdvemg 59 | data/atwzoszrue 60 | data/aujxjbehuz 61 | data/auoigmvbxt 62 | data/auprjrkwqd 63 | data/auzmsdnnhm 64 | data/avgfqtedcd 65 | data/avlfjeuozz 66 | data/avmyfsapcs 67 | data/awlskxaayc 68 | data/awnorqobve 69 | data/awrjjgpfok 70 | data/axietspzae 71 | data/axlbzcbfzt 72 | data/axliahbtym 73 | data/axnkkwaotc 74 | data/axnzqhlhrn 75 | data/axwpdgxruj 76 | data/ayaquhexqz 77 | data/ayghiketsd 78 | data/aysxspqqdm 79 | data/azivnorcbt 80 | data/azvxorjlrm 81 | data/bakuscluwn 82 | data/balbpgldho 83 | data/balpoltqvn 84 | data/basjckrjdf 85 | data/bblcipnywx 86 | data/bbwrqfawrj 87 | data/bcbrujsqxo 88 | data/bckqoiisbl 89 | data/bclowkiysp 90 | data/beactrbhub 91 | data/bekuilzxxn 92 | data/besaakdbin 93 | data/bfjdshvayr 94 | data/bftknghhed 95 | data/bfxevozqyq 96 | data/bgilydppiv 97 | data/bgpdudgyab 98 | data/bgpoldvzrh 99 | data/bgpzkygcea 100 | data/bgqnopotbe 101 | data/bgrazuzabd 102 | data/bgxvtdyush 103 | data/bhetenlzsp 104 | data/bighjkdqxa 105 | data/binribybof 106 | data/bjudloxvel 107 | data/bkrpegilqc 108 | data/bkzdqjuovy 109 | data/blfwnbitgb 110 | data/bltrrevthi 111 | data/bmhztsvskg 112 | data/bmlfuxhzck 113 | data/bnexllrfsq 114 | data/bnityfpill 115 | data/boumootsed 116 | data/bovdcqwtbf 117 | data/bpasruchcy 118 | data/bpkgdlopkm 119 | data/bqkjvmuhkq 120 | data/bqqaetrjss 121 | data/brgcqjtlie 122 | data/brgmdrsuld 123 | data/brhlyhehrq 124 | data/brpgearflr 125 | data/brrzqrgfcf 126 | data/bsvwmqamfn 127 | data/bsxuigrkhw 128 | data/btatuyvjcz 129 | data/btkhzjaqho 130 | data/btkwpzfjbu 131 | data/btxdrbdnpu 132 | data/buijfanqgj 133 | data/bunrneizgv 134 | data/burglzjysn 135 | data/bvefyxjvqr 136 | data/bvixniyivj 137 | data/bvknfkehmq 138 | data/bvpfmkzeoi 139 | data/bwddspodaz 140 | data/bweepvlxli 141 | data/bwioxwmzmk 142 | data/bwmgadcxfv 143 | data/bxpglfjtcw 144 | data/byiqfuoxfa 145 | data/byubcjfkzu 146 | data/byzmxujeng 147 | data/bzhvtbfwdp 148 | data/bzsubopmrv 149 | data/bzsxifhdeq 150 | data/cbfzxbwhdh 151 | data/cbhyxgmokb 152 | data/cbjazcafdf 153 | data/cbpaoachhz 154 | data/cbtxhyzfbh 155 | data/ccgmeohvnu 156 | data/cchjzlcplu 157 | data/ccmovtuglt 158 | data/ccnscxftah 159 | data/ccoxmlqpdz 160 | data/ccqibzllgr 161 | data/cctrhqvein 162 | data/cdawymhaak 163 | data/cdwbxofixe 164 | data/cefzoeryat 165 | data/cekwtyxdoo 166 | data/cerdtgydan 167 | data/cewhmeoiee 168 | data/ceyissnjuv 169 | data/ceykhsossc 170 | data/cezihuwtca 171 | data/cfizxbetpa 172 | data/cflpvgemyh 173 | data/cftcjrimex 174 | data/cgqkyamfzl 175 | data/cgxyezxteb 176 | data/cgzypqyewg 177 | data/chfeodetsk 178 | data/chihfjebdp 179 | data/chkknbagbw 180 | data/chkyctpgjr 181 | data/ciausjbpff 182 | data/cikqezajwn 183 | data/cimmfsbkyt 184 | data/cjkctqqakb 185 | data/cjlwdftbbi 186 | data/cjpjjjnsgz 187 | data/cjqqchxchr 188 | data/cjszyxkpjo 189 | data/ckolojkyqz 190 | data/ckskyotfdx 191 | data/ckumbevdrg 192 | data/clskneivay 193 | data/clyolrxzxs 194 | data/cmqwzqehdv 195 | data/cmyrwbuxek 196 | data/cnqvsvshlv 197 | data/cohkwaxnvw 198 | data/colylxvjmu 199 | data/cospepjvas 200 | data/cpxedkyytp 201 | data/cqeqirfagb 202 | data/cqgjvtnhir 203 | data/cqriqodldx 204 | data/cqxwnhupme 205 | data/cqxylbgxnc 206 | data/crnkpgykgj 207 | data/cslsqptoiw 208 | data/cstfqsxyhp 209 | data/cteolgekjy 210 | data/ctsxxraruc 211 | data/ctzgudcdyu 212 | data/cubiijddyv 213 | data/cubovymgid 214 | data/cumumecvxk 215 | data/cutdjzeeip 216 | data/cvbckybaaq 217 | data/cvtzzjrlfa 218 | data/cwasnpqxck 219 | data/cwlvjyebuo 220 | data/cwqislqtti 221 | data/cwzykvwllv 222 | data/cxeuodcmqd 223 | data/cygblzsrwn 224 | data/cytofsratb 225 | data/cyywjpwwdn 226 | data/daduxgwpjz 227 | data/dbffhqmctl 228 | data/dboosnvpgs 229 | data/dbvjpkvypm 230 | data/dbxckqbbur 231 | data/dcdmzumqzk 232 | data/dcfodaqazt 233 | data/dchhvxkhxi 234 | data/dcptbihiel 235 | data/dcqodpzomd 236 | data/ddkbgdbmud 237 | data/debszcijvd 238 | data/deoexpsdqf 239 | data/dfafrrltdi 240 | data/dfdxotpqfo 241 | data/dfhvynnars 242 | data/dgmujgivqu 243 | data/dhahwzhaoj 244 | data/dhattexrpi 245 | data/dhcrpdqqlv 246 | data/dhdmzidhht 247 | data/dheefpgewg 248 | data/dhwsdumcee 249 | data/ditdcwjuik 250 | data/djcuqtgccw 251 | data/djgspuaqqp 252 | data/dkbxybibnh 253 | data/dkmybfdiif 254 | data/dkrbtzkvnu 255 | data/dkuqbduxev 256 | data/dkvedxqgma 257 | data/dlofrcvqon 258 | data/dlvxejwbzc 259 | data/dlxvbfdfny 260 | data/dlyrqlgvcd 261 | data/dnzntxvurw 262 | data/doeeuppytb 263 | data/doesctevfp 264 | data/dolgjagncn 265 | data/doxxwkyeyy 266 | data/dpamqgszdc 267 | data/dpfzykxteg 268 | data/dpilxkugfs 269 | data/dpwpjeyyqc 270 | data/dpyckjuxij 271 | data/dqgjsmzcel 272 | data/dqubkheruj 273 | data/drjaegjgvo 274 | data/drmtykanjz 275 | data/drvtugrrjx 276 | data/dsaxwwtgtx 277 | data/dsjcxcmfgp 278 | data/dswvtfyjhv 279 | data/dtjnasdyyy 280 | data/dtvmqghkxl 281 | data/dudkzqczwl 282 | data/durhdaqfup 283 | data/dusdbgswfw 284 | data/dvuhqhgapq 285 | data/dvzugrydvc 286 | data/dwqoxeaejv 287 | data/dxcwgceyom 288 | data/dxwvavgnsr 289 | data/dyaerjijja 290 | data/dyjfkbskab 291 | data/dypzaguael 292 | data/dyuykxjdyd 293 | data/dzezotgbhf 294 | data/eahthbqnbe 295 | data/eaquarsawu 296 | data/ebczzbenwe 297 | data/ebvezhagrw 298 | data/ebxibuuior 299 | data/ecozbsimsz 300 | data/edjdplatqy 301 | data/edlswsvlxc 302 | data/edmiitrplj 303 | data/edmtrwmxkl 304 | data/eelbzbcbtz 305 | data/eevyugldiw 306 | data/eeyomeqcox 307 | data/efagybpxsa 308 | data/efatpchndx 309 | data/efdiqgqeka 310 | data/efpaxjwljv 311 | data/egglwffeoh 312 | data/egsbilbdyb 313 | data/egyyajhxxk 314 | data/eheykkgmjt 315 | data/ehptzgpilt 316 | data/ehrtdalgon 317 | data/ehssudncod 318 | data/eijokhuyst 319 | data/einzffdldz 320 | data/eitfpxnzwo 321 | data/ejiiapzrwx 322 | data/ejjsygqfvx 323 | data/eksuofducd 324 | data/ektuojlbkf 325 | data/ekuiikgthu 326 | data/ekzlzfmhoo 327 | data/elnadljsko 328 | data/elsmkmfkuk 329 | data/eluwjoxfav 330 | data/elwodtjxbz 331 | data/emjblzziyi 332 | data/emrmblrrtm 333 | data/emthoarbdj 334 | data/enavmziqtm 335 | data/enclclienu 336 | data/enphibvjne 337 | data/enpjmahsgj 338 | data/ensjhocuzm 339 | data/enxrusfqzc 340 | data/eokcarfull 341 | data/epeegcxwcp 342 | data/epymrzuqhm 343 | data/eqknkjnvea 344 | data/eqvyydpvxo 345 | data/eraprqybnh 346 | data/ercqmajdid 347 | data/eropxrspka 348 | data/erorbvkikv 349 | data/esfjjalvtf 350 | data/eshbpqddmx 351 | data/eshpypfpwg 352 | data/eswxwxovtu 353 | data/esxmqritho 354 | data/etfyvfbnbm 355 | data/etgczdcvvk 356 | data/etlavwxvxy 357 | data/etuhwwigem 358 | data/etxknonwli 359 | data/etziqrkyya 360 | data/euarbrmuzs 361 | data/eutlgwrkih 362 | data/euvpbsvwif 363 | data/evhpwknrdu 364 | data/evvacwqxzb 365 | data/ewcarvojld 366 | data/ewvcoskmnu 367 | data/exbcottrza 368 | data/exbxfmqqpx 369 | data/exlmepcdps 370 | data/exntculcjo 371 | data/exsbgixhir 372 | data/exunhdbwmp 373 | data/exxnwcwkge 374 | data/eyfpgyabpk 375 | data/ezlehpbfya 376 | data/ezmfsviyuc 377 | data/eznsavfnav 378 | data/faelhvqael 379 | data/fagdrfcvcf 380 | data/famlupsgqm 381 | data/fapkhkflmj 382 | data/fbpmpbqcxf 383 | data/fbsttogvjx 384 | data/fbyicumqml 385 | data/fcfuyeauun 386 | data/fckrovmlsc 387 | data/fcoosmczka 388 | data/fdfkccudyt 389 | data/fexpgzacof 390 | data/ffolstniaz 391 | data/ffowuinxte 392 | data/ffzyswbaxs 393 | data/fgcvmubbzp 394 | data/fgobmbcami 395 | data/fgophendij 396 | data/fgyjlqhugm 397 | data/fhfnixrhws 398 | data/fhjhvdgmcq 399 | data/fhknqsokhi 400 | data/fhsdyqtcja 401 | data/fhvsnnxmjf 402 | data/fimhhyetym 403 | data/fiqgnthvfg 404 | data/firlsjvtup 405 | data/fjhydagkns 406 | data/fkrpuyjzbt 407 | data/fktxniwzxe 408 | data/fkwucbqnot 409 | data/fleoawtvif 410 | data/fllkhvqdtf 411 | data/flxsxcgfkz 412 | data/fmegtxqovc 413 | data/fmldeiihya 414 | data/fnlepxxlip 415 | data/fntpvkeksp 416 | data/fnxgqcvlsd 417 | data/foiczxqruw 418 | data/foohyhbmhe 419 | data/forqbzjgjc 420 | data/fpcepeefho 421 | data/fpiybwcszz 422 | data/fplbjxvolk 423 | data/fpvurjklwt 424 | data/fqeebgwwfs 425 | data/fqeytkksjm 426 | data/fqmwhnpduz 427 | data/fsywibkykv 428 | data/fumyyqfash 429 | data/fvcrfzzfnm 430 | data/fvphehmebp 431 | data/fvprwqavma 432 | data/fvtjedjgsr 433 | data/fwimqamfst 434 | data/fwsbbpbexg 435 | data/fxrtkfzqcm 436 | data/fyiymoftcx 437 | data/fymbnorwmg 438 | data/fyqyindnzs 439 | data/fzbftmubit 440 | data/fzgisyxqhy 441 | data/fziunnjfsj 442 | data/fzmnxvmtgh 443 | data/fzqhufhqfw 444 | data/fzraggegkz 445 | data/ganhyrbocg 446 | data/gbqmtnsweh 447 | data/gbwgfjfwax 448 | data/gcdtglsoqj 449 | data/gcjtyaqiwo 450 | data/gckfzomoxu 451 | data/gdmnnlgnpz 452 | data/gdpklemybz 453 | data/gdwjwgbyse 454 | data/geesluddxj 455 | data/gemkhcfaka 456 | data/gemrvqslyk 457 | data/gerwprlefx 458 | data/getllmoacf 459 | data/geywccqnyg 460 | data/gezwdkrytm 461 | data/gfaokyqycj 462 | data/gfcspejcib 463 | data/gfpkrucyku 464 | data/ggiofuenqc 465 | data/ggjcrroblk 466 | data/ggrxjfxdxm 467 | data/gimqjixlbw 468 | data/gisfmijhfw 469 | data/giwwrlbsjc 470 | data/gklxjvzirw 471 | data/gkxgqtjokl 472 | data/gloxelyhst 473 | data/gmdrzdxsfh 474 | data/gmgzufywqd 475 | data/gmrxvmvrzt 476 | data/gmtxkpliex 477 | data/gmutjqhliq 478 | data/gmwbwhcdko 479 | data/gmynszfycz 480 | data/gnktnqnipj 481 | data/gnyqluuenf 482 | data/gnzwqtcupx 483 | data/goakjsojgk 484 | data/gobzlemppm 485 | data/gpgtsauwaw 486 | data/gpjhljtyoq 487 | data/gpkresscry 488 | data/gptrgbtqem 489 | data/gpuvjjknrl 490 | data/gpuwiicfxo 491 | data/gpzfnoxodh 492 | data/gqavyegpot 493 | data/gqooyqcmpv 494 | data/gsdxqkdkzu 495 | data/gsshxchgqv 496 | data/gsxfhwihop 497 | data/gtpocctdjv 498 | data/gtqxflvavu 499 | data/gttqggvfav 500 | data/gujltqnimc 501 | data/guzzizvlka 502 | data/gvcmjpbcvd 503 | data/gvwsgyexpl 504 | data/gwhhwvbidr 505 | data/gwwtpriqcy 506 | data/gxcakcrndd 507 | data/gxnpgaquti 508 | data/gxrocwxkyy 509 | data/gygjqhfdvw 510 | data/gyllmdpgqz 511 | data/gzwthckmpd 512 | data/hccvzjiemg 513 | data/hceatcueei 514 | data/heoufzaddn 515 | data/hetxvghqhn 516 | data/heunzildxt 517 | data/heurdiogcw 518 | data/hfdkskwrwk 519 | data/hfedtplyys 520 | data/hflhhnqajt 521 | data/hfvxpofxfr 522 | data/hgfcupavaj 523 | data/hgixraeaye 524 | data/hgqqxcrajb 525 | data/hgzmovwegj 526 | data/hihllafeup 527 | data/hirhitmzio 528 | data/hjkojzpklh 529 | data/hjsvoblumx 530 | data/hjxeekdmab 531 | data/hkhleykexb 532 | data/hkhutqidrk 533 | data/hklwformks 534 | data/hlhaljdyga 535 | data/hmajsjwmbc 536 | data/hncakxzmou 537 | data/hnfssbkumw 538 | data/hnitnjujrv 539 | data/hnqqfjpioa 540 | data/hoihzcvsgv 541 | data/hojfceejsf 542 | data/hozyutxylm 543 | data/hphgvxgldu 544 | data/hqeqmvombq 545 | data/hqompqlkft 546 | data/hrpxiqilkc 547 | data/hseotizotm 548 | data/hsijsvfjao 549 | data/hslupphtel 550 | data/hsoxbifzxi 551 | data/hszesmmtxb 552 | data/htlxcpesej 553 | data/htsicgwcfb 554 | data/hurysmfmyk 555 | data/hvgvjintyv 556 | data/hvmbirnoyr 557 | data/hvmcslpaeu 558 | data/hvqyqdksse 559 | data/hvuhsugadn 560 | data/hvvcnzkkoo 561 | data/hwqatepsyz 562 | data/hxwtsaydal 563 | data/hyafqbzgin 564 | data/hyimplklmb 565 | data/hyisqrjnki 566 | data/hynowuipao 567 | data/hzoiotcykp 568 | data/iadyctdpxp 569 | data/iakzfiumwi 570 | data/ibcwijeodg 571 | data/ibmehtjscb 572 | data/icsxletuwy 573 | data/icybqyznrg 574 | data/iegzhaqbvj 575 | data/ielwvvgavv 576 | data/ienvvxcruh 577 | data/ievilxkyna 578 | data/ievkliwull 579 | data/iewrgvhrtf 580 | data/ieycmlnprv 581 | data/ifjkbdsjpx 582 | data/ifkqknsmuo 583 | data/iggfjxzsbf 584 | data/ighsijifvf 585 | data/ihckldqxzj 586 | data/ihglzxzroo 587 | data/ihjtmuxuom 588 | data/iibsbkbegu 589 | data/iiclkuiexg 590 | data/iicmtlqqga 591 | data/iifpjbejaf 592 | data/iihsomcgkj 593 | data/iiqvaksbky 594 | data/ijptktlyfr 595 | data/ikqymawnzl 596 | data/iksqygcnyj 597 | data/iltklvhlph 598 | data/imsfcsgabz 599 | data/imvrshlser 600 | data/inkxxqwrzi 601 | data/inntpctwlu 602 | data/intjehdtxz 603 | data/inxftbkcqq 604 | data/iodwjkqblp 605 | data/ioiqejhmtf 606 | data/ipkpxvwroe 607 | data/ipmwgbmbjb 608 | data/ipvwtgdlre 609 | data/iqgcofuajv 610 | data/irbixkoiqa 611 | data/irddfguovg 612 | data/irjhgojodp 613 | data/irtjjofhwa 614 | data/irwcschyys 615 | data/isoxfyhcuu 616 | data/itlwgvaxiv 617 | data/iubklilvdl 618 | data/iueeqwaykq 619 | data/iuukqiavbb 620 | data/ivczqfnnxf 621 | data/ivuceegsjg 622 | data/iwhjscvlfg 623 | data/iwladlmomt 624 | data/iyjscyomzv 625 | data/iytyxfdmmf 626 | data/iywrddavxt 627 | data/izcxebhtfp 628 | data/izgumqcxhi 629 | data/izkqquaqpw 630 | data/izkypnzjhl 631 | data/izruqmbare 632 | data/izurqowaxf 633 | data/jacvxyeeqa 634 | data/jagdzowdri 635 | data/jailgizmln 636 | data/jalutuvgew 637 | data/jaomwewhxt 638 | data/jcpimqracm 639 | data/jdhfrxodqe 640 | data/jdnizohssx 641 | data/jdsqboubqm 642 | data/jdsurjvxxq 643 | data/jeaovjrwbh 644 | data/jetugcmdfk 645 | data/jevtstncoj 646 | data/jfecpdvglu 647 | data/jfmchvdonq 648 | data/jfxzbxjbac 649 | data/jgfmyvsidd 650 | data/jghitsalsd 651 | data/jhcxyejyef 652 | data/jhjghxwhep 653 | data/jhomaktgzy 654 | data/jhyfxihnws 655 | data/jibxryehyp 656 | data/jicsxmypxm 657 | data/jidosktebk 658 | data/jieyxqsecs 659 | data/jikxmvntlu 660 | data/jiltjygimx 661 | data/jipjequbqf 662 | data/jjlbxnlccv 663 | data/jjnzvsibrs 664 | data/jjusjkovfy 665 | data/jjxjswkjbm 666 | data/jkekbhvtkr 667 | data/jkhukelids 668 | data/jkrdcoeyzx 669 | data/jkwcmcdbmi 670 | data/jlzckbmrbw 671 | data/jmfrlvnlbm 672 | data/jmoltzkhax 673 | data/jmpumaauyh 674 | data/jmqmljznhv 675 | data/jnnsgzdxtn 676 | data/jorezqxvud 677 | data/jozlysmacz 678 | data/jpaiyivxzh 679 | data/jprzyhqvis 680 | data/jqiayxomia 681 | data/jqiyrrspsj 682 | data/jrabjapswc 683 | data/jrlodkmngy 684 | data/jrxmcmigoq 685 | data/jsdzhlsgbl 686 | data/jsprhkyuwc 687 | data/jswunuyhcq 688 | data/jsysgmycsx 689 | data/jtazbdmcqi 690 | data/jtdycuybti 691 | data/jtilgqqkab 692 | data/jtnqntwshv 693 | data/jtohkanmcb 694 | data/jtvcxbfuks 695 | data/juhpgqxkwl 696 | data/jumllfuvgm 697 | data/jvtjxreizj 698 | data/jwgasxcjou 699 | data/jwjyxtjdvp 700 | data/jwwenrxcrk 701 | data/jxgkmoscja 702 | data/jygnpdukjy 703 | data/jyvahtpmxe 704 | data/jzbclihsto 705 | data/jzsdlsaodc 706 | data/jztbbimrsr 707 | data/kahkedgaab 708 | data/kaojqcodsu 709 | data/katmliewya 710 | data/kavfrbqacm 711 | data/kazjfzgayu 712 | data/kbfmtujkqg 713 | data/kbgdtsrfme 714 | data/kbgynbpxnx 715 | data/kbxmnovqbo 716 | data/kcpekahuma 717 | data/kcurhrizjt 718 | data/kehyerywza 719 | data/kekcewiqhl 720 | data/kezpaqosyh 721 | data/kfeajzzucv 722 | data/kfuhunxnno 723 | data/kgckxrwwut 724 | data/kggcytfhaf 725 | data/kgiaxegsex 726 | data/kgmaobkbdu 727 | data/khdsluivuv 728 | data/khjkpcgfek 729 | data/khmkdepeiw 730 | data/khmsjyzueh 731 | data/khtwrijuqn 732 | data/khvlzqaptr 733 | data/khzgjlgsuk 734 | data/kifzxbsnku 735 | data/kigahxiwil 736 | data/kipsisnlxc 737 | data/kiqphqnazo 738 | data/kiresyxsem 739 | data/kiujopxeti 740 | data/kiyvsruaai 741 | data/kjcstjpivk 742 | data/kjvussgtbm 743 | data/kkqwiruktw 744 | data/kligyzlcuk 745 | data/klisuzrptl 746 | data/klvlmkolvx 747 | data/kmcffzemiv 748 | data/kmdfaktlxb 749 | data/kmkrpnhqkd 750 | data/kmktfamvoi 751 | data/kmrojywxvz 752 | data/kmrsuhzgyg 753 | data/knjceurdhv 754 | data/knjdcfbrzn 755 | data/knsikqqjrw 756 | data/knyjygzoat 757 | data/knzapnazlb 758 | data/kojsoyqxrd 759 | data/kpguqwojtm 760 | data/kqbtuywibk 761 | data/kqfaiaxafz 762 | data/kqkblcxaas 763 | data/krcdaogpuv 764 | data/krfyaaruhm 765 | data/krhqhnxdpt 766 | data/krifcuqyay 767 | data/krtsygzllg 768 | data/kryrpsthjp 769 | data/kstrpowvav 770 | data/ksyusmyapq 771 | data/ktkjmqrvxt 772 | data/ktpjnkejhm 773 | data/ktqkhqensy 774 | data/kuakvgktac 775 | data/kuokgeklnk 776 | data/kuzcdkyues 777 | data/kvdnaxkcbz 778 | data/kvhqiaatsm 779 | data/kvidlzexqa 780 | data/kvnxaqrjgf 781 | data/kvnxcfkctx 782 | data/kvxdcbxdcd 783 | data/kvyzhxwwfb 784 | data/kvyzrqpihg 785 | data/kwbvipecaa 786 | data/kxlehffktu 787 | data/kyeewoffli 788 | data/kyjbwhecoc 789 | data/kyxmtfyceu 790 | data/lacelvudpn 791 | data/lagnvmxexq 792 | data/lagwkzjwdl 793 | data/lapbrokvri 794 | data/larzbmlbuj 795 | data/lbjdjmcnoz 796 | data/lbjmvsxruc 797 | data/lbqwonpufw 798 | data/lbwmciaztf 799 | data/lcloalkyrx 800 | data/lclrhuuwnj 801 | data/ldfwfcdulq 802 | data/ldgxjgfrhj 803 | data/ldmoodikzl 804 | data/ldmxihjqta 805 | data/ldtkxdqbtb 806 | data/ledddkfcbk 807 | data/ledwcahvbf 808 | data/leurankyic 809 | data/lfeokaeaxl 810 | data/lfhylfpbem 811 | data/lfiuxgvxkf 812 | data/lgdmireaib 813 | data/lgxoubaxnk 814 | data/lhfngqvexu 815 | data/lidetzyzjl 816 | data/lildtedrec 817 | data/liwjjdhggc 818 | data/ljvbgkmuss 819 | data/lkaujabuvv 820 | data/lkgrqfcrps 821 | data/lkpxzehihg 822 | data/llaqdzerwc 823 | data/llplvmcvbl 824 | data/llwajzixvu 825 | data/lmdtgrilof 826 | data/lmtlkeqvli 827 | data/lmvgprgmlh 828 | data/lnnnqlgtld 829 | data/lnyconlqik 830 | data/lobywtfcmi 831 | data/lptongiurm 832 | data/lqwkuvnitm 833 | data/lrbziwcphu 834 | data/lrhaswnflf 835 | data/lrjfwstjpr 836 | data/lrnxpopgkl 837 | data/lrwywitjew 838 | data/lrzqhstodd 839 | data/lsetxasdxl 840 | data/ltbkxsufne 841 | data/ltctttgupm 842 | data/ltfvpafmgk 843 | data/ltsqbnacho 844 | data/lttnazdrxy 845 | data/ltzpabbpou 846 | data/lugzkkhoer 847 | data/luverjecuo 848 | data/lvazyngbtu 849 | data/lvglcazbst 850 | data/lvidvlwsah 851 | data/lvqtrvbsle 852 | data/lwtjkykrfh 853 | data/lxetdwpbvc 854 | data/lydxafrxsy 855 | data/lzcfvpedir 856 | data/lzwpfjbepu 857 | data/mafrgxljhe 858 | data/mauhvrtjcq 859 | data/mbfbtbsmwd 860 | data/mbmxbsyiaz 861 | data/mbobymsxyq 862 | data/mcbyoomvqg 863 | data/mcdydajwbb 864 | data/mdfndlljvt 865 | data/megxyffexb 866 | data/mesliumkwa 867 | data/mesmxqitcl 868 | data/meumybmwti 869 | data/mewaafuknw 870 | data/mfcdogcags 871 | data/mfkwnwrwdr 872 | data/mfxwhrwomd 873 | data/mfzqxwzusu 874 | data/mgvglvwovs 875 | data/mhovvnvttx 876 | data/miaigizqew 877 | data/midpeunjaz 878 | data/mitviaecyj 879 | data/miwsnvijjt 880 | data/miyfwiaiee 881 | data/mjjcsxynrv 882 | data/mjrdizjvsc 883 | data/mjrqooshbs 884 | data/mkwhpzswmo 885 | data/mkxzfysiua 886 | data/mlivldbdxg 887 | data/mlxlijxzeu 888 | data/mlznlqmcet 889 | data/mmhyninywo 890 | data/mmqgopsczd 891 | data/mmtguxjmhz 892 | data/mnslaqqghi 893 | data/modwqruopr 894 | data/mogvaichzb 895 | data/moiamctvbz 896 | data/moiehodfkl 897 | data/mowkdaiums 898 | data/mpeqnueqgc 899 | data/mplyhvifpg 900 | data/mpwtgbufwm 901 | data/mqbktovcxh 902 | data/mrctprnqnq 903 | data/mrkwwadnqs 904 | data/mrzqtewocv 905 | data/mrzxwbdycf 906 | data/msaofiaxna 907 | data/mshechsves 908 | data/mshibrgvlv 909 | data/mshtebowpn 910 | data/msywjakvfe 911 | data/mtiqyulcjn 912 | data/mtkmdkxdmg 913 | data/mufpsfcwnd 914 | data/mugpedpwbl 915 | data/mujmyarcbg 916 | data/murqgmxknx 917 | data/mutuhmwjdv 918 | data/mveoqfdzcs 919 | data/mvfrifsgrb 920 | data/mvuyaxaefk 921 | data/mwbhwrjoiq 922 | data/mwjbchqkpg 923 | data/mxfblxtind 924 | data/mxjodtlgjw 925 | data/mxkwkkhbmw 926 | data/mxuwtkorlm 927 | data/myaukmfnow 928 | data/mymdvihnlj 929 | data/mzijagvmmz 930 | data/mzngitwont 931 | data/mzpveglnyf 932 | data/mzxtfngffh 933 | data/nalstjqemq 934 | data/nasrqqcips 935 | data/nblsdjrazz 936 | data/nbmhltbwia 937 | data/nbnpjxbwyk 938 | data/nbscmtskvm 939 | data/nccigdndow 940 | data/ncdccrmjcs 941 | data/ncdipylsrq 942 | data/ncmxzviawx 943 | data/ncvlimnpqv 944 | data/ndfrtxtzvb 945 | data/ndpkorqsvv 946 | data/neihpjarlt 947 | data/nelwkjhuhv 948 | data/nfjxrglzru 949 | data/nflvzmhrav 950 | data/nhfzdczcig 951 | data/nhgyntvhbg 952 | data/nhpoezjtev 953 | data/nhuxbfzqqf 954 | data/nhxuxwpinw 955 | data/niyghrbqtl 956 | data/nkvgaupnen 957 | data/nkwcryvgfm 958 | data/nkwinutkgu 959 | data/nmbvilqkig 960 | data/nmnlknzyet 961 | data/nnqcyporze 962 | data/nnvguviyuk 963 | data/nnzqouukoj 964 | data/noljdyeghv 965 | data/npffculfnf 966 | data/npotcizfal 967 | data/npqopmpguh 968 | data/npwierprus 969 | data/nqabjvkxuf 970 | data/nqoojvyaiy 971 | data/nrboackadj 972 | data/nrcikcukhf 973 | data/nrejgewmad 974 | data/nsjtsvvsly 975 | data/nttcjrrynk 976 | data/nuolfdjuan 977 | data/nwbixgpidd 978 | data/nwboifkqfm 979 | data/nwjabgcyma 980 | data/nwtdlrhqtf 981 | data/nxbkmfosfp 982 | data/nxdubandjx 983 | data/nxfbpqkosg 984 | data/nxfdrxshdh 985 | data/nxosnovbjl 986 | data/nxvjxvykqp 987 | data/nylwyrqaot 988 | data/nypfqpmogz 989 | data/nyvadgqzno 990 | data/nzlfbilwow 991 | data/nzuvtbkmye 992 | data/oambyopbqc 993 | data/oawqlifzsl 994 | data/obbhgtppov 995 | data/obueljrnaf 996 | data/ocaltsptla 997 | data/octnezlnfn 998 | data/odbjkpcvjj 999 | data/oehykcuwpj 1000 | data/oeqjtdvvvl 1001 | data/ofqkefrrrt 1002 | data/ogaakxbtdl 1003 | data/ogaxeeegzg 1004 | data/oguqwtfjlx 1005 | data/ogznalgvrd 1006 | data/ohfokpxnqm 1007 | data/ohofmyydou 1008 | data/ohtngifnek 1009 | data/oiilknhpqy 1010 | data/oirvlkospn 1011 | data/oizgennqfn 1012 | data/ojagblcuat 1013 | data/ojqaffhyse 1014 | data/okitloehws 1015 | data/okoueyswyl 1016 | data/okqrvkecxk 1017 | data/okrrtlhqlz 1018 | data/okxgxnrnbh 1019 | data/olfxrsknkx 1020 | data/olslsldbob 1021 | data/omgcydugep 1022 | data/omyicmcbbu 1023 | data/omytlpzopy 1024 | data/oneizjknqm 1025 | data/onhthjbayk 1026 | data/onpcjkzyoa 1027 | data/ooackdhquw 1028 | data/ooijvhhwdr 1029 | data/ookknankar 1030 | data/oolvtdigom 1031 | data/oooirnmiwe 1032 | data/oowswkomhm 1033 | data/opifjnpsrx 1034 | data/opithuhnkd 1035 | data/opwqlxzcaf 1036 | data/opymvojpuv 1037 | data/oqglliennm 1038 | data/orblnqzpra 1039 | data/orekjthsef 1040 | data/orldpmngae 1041 | data/osjvlnohwr 1042 | data/otlwekplev 1043 | data/ouetzpfrnh 1044 | data/ounsrmikkd 1045 | data/ouoqfjpcqy 1046 | data/ovqhixefor 1047 | data/ovxwligoon 1048 | data/owfikslizm 1049 | data/owsottcucc 1050 | data/owxteuqpay 1051 | data/oxdwdoeger 1052 | data/oxplrvbopu 1053 | data/oyixebfpcl 1054 | data/oyjzcpvrfg 1055 | data/oyoyvpwnhl 1056 | data/oysopgovhu 1057 | data/oytuvmdajj 1058 | data/oyvmvoikbp 1059 | data/ozgrnalsrj 1060 | data/ozzeofnvmc 1061 | data/paflizqbgw 1062 | data/pagaahnols 1063 | data/pagnmwtkkt 1064 | data/paxjtitipz 1065 | data/pbxvqvqxem 1066 | data/pcoxcmtroa 1067 | data/pcvpkdmppy 1068 | data/pcwgywgzjf 1069 | data/pduoolrqno 1070 | data/pejnqlovvf 1071 | data/peqtejnxvv 1072 | data/pfaxkqcuqn 1073 | data/pfrhvklprx 1074 | data/pgbbbcmotu 1075 | data/pgqcghptso 1076 | data/pgvkkpnfrg 1077 | data/phhbzksbkx 1078 | data/philxwuuxh 1079 | data/phoxxwoozc 1080 | data/phtwqvezao 1081 | data/pjcvnirkwi 1082 | data/pjlswenrwb 1083 | data/pjmnypqmlf 1084 | data/pjonlkhyqh 1085 | data/pjuzhtsbdr 1086 | data/pjxjmwwaoj 1087 | data/pkqrvokzaq 1088 | data/pllqrtbjdv 1089 | data/plusrukaam 1090 | data/plxoblbkiv 1091 | data/pmcxrzpafk 1092 | data/pmmehromkc 1093 | data/pnzjahgfcj 1094 | data/powgoqjeip 1095 | data/ppegxwyrxb 1096 | data/pqijxhlbyw 1097 | data/pqlxybtkbo 1098 | data/prwsfljdjo 1099 | data/psaokntwiy 1100 | data/psegambhyq 1101 | data/pskjrrupny 1102 | data/psnivxcrjb 1103 | data/psrcrajmmo 1104 | data/psrnjaooiu 1105 | data/ptchnzeeqc 1106 | data/pthlshvzqz 1107 | data/puifrhvwij 1108 | data/pvcawvxzom 1109 | data/pvpfmghnif 1110 | data/pwaqrbyaat 1111 | data/pwftvlkjqp 1112 | data/pwnfhdvxkq 1113 | data/pxaceeskeg 1114 | data/pxncrwhyia 1115 | data/pxvbhruceg 1116 | data/pycijresne 1117 | data/pzhoqhdizu 1118 | data/pzsprkukia 1119 | data/qadqzqlgcf 1120 | data/qaynucyryk 1121 | data/qbiauhajds 1122 | data/qbkiiitkni 1123 | data/qbpxgmfkgp 1124 | data/qcbkztamqc 1125 | data/qcfwiogzgu 1126 | data/qcigzolsmv 1127 | data/qctcumfqty 1128 | data/qdogpgieqw 1129 | data/qechlfmdtv 1130 | data/qehuvzvqqg 1131 | data/qfkfqzykjt 1132 | data/qflvhvhymj 1133 | data/qgikbkkady 1134 | data/qgliltfbng 1135 | data/qgpxmovzga 1136 | data/qgtniqqpzf 1137 | data/qgyfyqxdmy 1138 | data/qhtwtxvlan 1139 | data/qifxbfhtoe 1140 | data/qjcieuzlgj 1141 | data/qjmmfjyorx 1142 | data/qjmxmyhmje 1143 | data/qjqoxvnaep 1144 | data/qjvjkojjkl 1145 | data/qjyocqfdob 1146 | data/qkdjcpazpp 1147 | data/qkemkbnsys 1148 | data/qklvqreuqy 1149 | data/qlbgumdyqv 1150 | data/qlbphfahuf 1151 | data/qlsvdhmqqt 1152 | data/qltfpcrpbu 1153 | data/qlvhphfill 1154 | data/qmfnpmddeq 1155 | data/qncbvzovqu 1156 | data/qnfuimgzmx 1157 | data/qnkvjufsyp 1158 | data/qnxyrntvsj 1159 | data/qnygjjuhwp 1160 | data/qoalwspkzc 1161 | data/qokntutfen 1162 | data/qollefgenu 1163 | data/qormslhpqt 1164 | data/qpbrknxeci 1165 | data/qpfptydstc 1166 | data/qppqflphhz 1167 | data/qqjmgyicqe 1168 | data/qqqfldwehi 1169 | data/qrezkkaymo 1170 | data/qrgezzxkzw 1171 | data/qriicptrta 1172 | data/qrptqjimaj 1173 | data/qscuydoqyv 1174 | data/qsrahhgpky 1175 | data/qstwsouygg 1176 | data/qswlzfgcgj 1177 | data/qtelsrvetz 1178 | data/qtfieshmjo 1179 | data/qtjkrgyxjh 1180 | data/qtpmdvwqhh 1181 | data/qtulvrsbnl 1182 | data/qudzjrpjlj 1183 | data/quftvwnleq 1184 | data/quxpjjimyi 1185 | data/qvpntddupb 1186 | data/qvubfjvujf 1187 | data/qwleauyffp 1188 | data/qwvxfewpwj 1189 | data/qwxjnbdwdv 1190 | data/qwxtwaqlpb 1191 | data/qwyuwvfdsh 1192 | data/qxatnspkbp 1193 | data/qxmvgpsbpg 1194 | data/qxzuuzvpmg 1195 | data/qypwgbrgct 1196 | data/qyrrozbgxw 1197 | data/qyyhuvqmyf 1198 | data/qzwmmvsjjc 1199 | data/qzxaqhqzon 1200 | data/raaeqtxmqu 1201 | data/raordaotvd 1202 | data/ravmezjflv 1203 | data/razxducjvl 1204 | data/rbhwagdxvx 1205 | data/rbwbmqvtkr 1206 | data/rbydjieaci 1207 | data/rcecrgeotc 1208 | data/rcksvbjhyg 1209 | data/rcmlgvvgoe 1210 | data/rcmnccewdv 1211 | data/rczaxiryex 1212 | data/rdaurvwjkh 1213 | data/rdmyllnaxb 1214 | data/rdzyzwqhde 1215 | data/rerpivllud 1216 | data/reudiptskb 1217 | data/rewyhkernx 1218 | data/rezfcgkjlx 1219 | data/rfbfnghamo 1220 | data/rffoncdaqy 1221 | data/rfreelhcas 1222 | data/rgarqfixsm 1223 | data/rgcplyuqwy 1224 | data/rgglgyfbfk 1225 | data/rgiknexmjo 1226 | data/rgxaccnokf 1227 | data/rhemiwruny 1228 | data/rhncslawoz 1229 | data/rhpwnedqmj 1230 | data/rikuzqxsyb 1231 | data/rildbtyaoa 1232 | data/riolylselx 1233 | data/rirzhrtoub 1234 | data/rjvwbxfokp 1235 | data/rkhdbhehfq 1236 | data/rkmykkoubd 1237 | data/rkpkrpuwal 1238 | data/rlephvzrar 1239 | data/rlhxvxvnqg 1240 | data/rlkrteswpq 1241 | data/rloltgotif 1242 | data/rlwtwlytnp 1243 | data/rmbfitfevx 1244 | data/rmvbrxpjwn 1245 | data/rmyfxxhhov 1246 | data/rodaoirzgq 1247 | data/rohakxryar 1248 | data/rpdtsqbbun 1249 | data/rpjyucgnhi 1250 | data/rplxcgcmaq 1251 | data/rqgdnzrjbh 1252 | data/rqmdhgkyjc 1253 | data/rrjdtfbygt 1254 | data/rrlgynofwd 1255 | data/rrrfjhugvb 1256 | data/rrtdgbxwul 1257 | data/rsuzqyjrhm 1258 | data/rswefytioa 1259 | data/rsxvcbgzba 1260 | data/rtmbucxfef 1261 | data/rtuoohyikq 1262 | data/rtuttkvivd 1263 | data/rubsrklwhx 1264 | data/rupxkhjmhe 1265 | data/ruwlnronut 1266 | data/rvhdiancpz 1267 | data/rvhkguqcff 1268 | data/rvmoyrngqg 1269 | data/rwiymusbmg 1270 | data/rwvlnrarag 1271 | data/rxhklivqeh 1272 | data/rxhqujqzwh 1273 | data/rxkpsfadjt 1274 | data/rxxbhqppcc 1275 | data/ryocokscze 1276 | data/ryowxmsqnk 1277 | data/ryxaqpfubf 1278 | data/rznhsemash 1279 | data/rzrmfxvxdw 1280 | data/rzxgegjfax 1281 | data/sanfylabug 1282 | data/sbgnqpkpyt 1283 | data/sbhnywxsfg 1284 | data/sbpbpxzspy 1285 | data/sbsonxryir 1286 | data/sbvtjrwxng 1287 | data/sbzhqdbslb 1288 | data/sckgpvbzpc 1289 | data/scvhikwhdn 1290 | data/scxjhrejub 1291 | data/sdxfhccfrn 1292 | data/secfenlviu 1293 | data/sekosqymqa 1294 | data/semkwpxsom 1295 | data/serxntdxpl 1296 | data/sfqwnoixtm 1297 | data/sgtulmvely 1298 | data/sgyukghvrh 1299 | data/shclgsfxtj 1300 | data/shlqreycrj 1301 | data/shmecmjrgn 1302 | data/sjruktxnas 1303 | data/skaimvshsj 1304 | data/skjzebhser 1305 | data/slaqauiuvy 1306 | data/slfwxkmdgo 1307 | data/slgsmhgyso 1308 | data/slncaditco 1309 | data/slnwzzepqz 1310 | data/smgupfkkjo 1311 | data/smvyymdsdc 1312 | data/sndsnqxmjh 1313 | data/sngufxuual 1314 | data/snijmzqzux 1315 | data/spkpqwhhdt 1316 | data/spscjnjdsx 1317 | data/spxyvjkiso 1318 | data/sqintuggou 1319 | data/sqyznyderl 1320 | data/srpvgysqdx 1321 | data/srsaxaghht 1322 | data/ssuxrxhshr 1323 | data/ssxxpkjhlc 1324 | data/stgweqepva 1325 | data/sttjoqcsec 1326 | data/styhzwgwxp 1327 | data/svodgmtwsu 1328 | data/svynysfmaq 1329 | data/swftkyiklu 1330 | data/swkiblawat 1331 | data/sxowdiunca 1332 | data/sxscnjzfbo 1333 | data/sxskbtitzz 1334 | data/sxyrkshzsg 1335 | data/sxysimhbmy 1336 | data/sykzzwoxgi 1337 | data/sylnrepacf 1338 | data/szolumnysp 1339 | data/szphwfzcfl 1340 | data/szrvguxoph 1341 | data/taefeypdtx 1342 | data/taqnnsyxip 1343 | data/tbeoifmmhh 1344 | data/tbsbklubov 1345 | data/tbsgtffckm 1346 | data/tbzzorjdaj 1347 | data/tcwsnqstqa 1348 | data/tdvovkccep 1349 | data/tegokigxgp 1350 | data/tehiwkmctd 1351 | data/teqhpjlpza 1352 | data/terlujixxf 1353 | data/tetpxkxdag 1354 | data/tffqzimrax 1355 | data/tfhgywecka 1356 | data/tfjvbeihlx 1357 | data/tfprsyrhjj 1358 | data/tfpzjsytdd 1359 | data/tfwwujmztf 1360 | data/tfxtegykcp 1361 | data/tgtaisacai 1362 | data/tgwvzoncvd 1363 | data/thikiylwje 1364 | data/thjzrpohya 1365 | data/thmwcolqan 1366 | data/thragtlguq 1367 | data/thtsbqkeht 1368 | data/tilhcwenpk 1369 | data/tjgqkseyta 1370 | data/tjtuzrkmqw 1371 | data/tjuihawuqm 1372 | data/tjumanauqk 1373 | data/tkfmyrqzqr 1374 | data/tkmbczjxjr 1375 | data/tltkrnbwei 1376 | data/tlvdmhfmuy 1377 | data/tncmmpovjn 1378 | data/tnyzgaiwea 1379 | data/toqcubtxwm 1380 | data/toukipiujn 1381 | data/toxpbvzswn 1382 | data/tpftkaveyq 1383 | data/tpilpqylqs 1384 | data/tqawtxllam 1385 | data/tqjfamkugs 1386 | data/tqvdelijls 1387 | data/trifnvfkez 1388 | data/truwgbqpni 1389 | data/trwucycqvi 1390 | data/tsasvgamkg 1391 | data/tshfoikelz 1392 | data/tukwtgucft 1393 | data/tupuzhcmpz 1394 | data/tuypqalivh 1395 | data/tuysjkbime 1396 | data/tvustqhukp 1397 | data/twdyadyipb 1398 | data/twyuptofek 1399 | data/txcbkicwgk 1400 | data/txdcmspaaa 1401 | data/txecywhbwn 1402 | data/txlzfnddji 1403 | data/txoroydndn 1404 | data/tycjqobctl 1405 | data/tykpfgtcgd 1406 | data/tyuogvsbjg 1407 | data/tzymnaotuh 1408 | data/uacgfljxrz 1409 | data/ualynkvqch 1410 | data/ubxlhztujz 1411 | data/ucorvldjhi 1412 | data/ucvpzauvoh 1413 | data/udhrnsnbmb 1414 | data/udldxmeurc 1415 | data/udpmccmnpt 1416 | data/udpmeyovdm 1417 | data/uexzuieavb 1418 | data/ufamzlflqa 1419 | data/ufavdaiyyi 1420 | data/ufoipgblmn 1421 | data/ugbkexlzgv 1422 | data/ugzpmmyogi 1423 | data/uhpnixcknb 1424 | data/uhqbwdgeur 1425 | data/uhqwaoxxcj 1426 | data/uidllncyjd 1427 | data/uipindbexi 1428 | data/ujlvwgyhgk 1429 | data/ujpzgghvrp 1430 | data/ukkasncnkh 1431 | data/uklvicywwv 1432 | data/uksqzousoi 1433 | data/ulevggstoz 1434 | data/umkcmvnmrp 1435 | data/umxfriluuu 1436 | data/undacbsroe 1437 | data/uphkzkvshe 1438 | data/uqidpaginj 1439 | data/uqidvkpfxa 1440 | data/uqjwtcmhek 1441 | data/uqplddijii 1442 | data/uqtrvfugdi 1443 | data/uqwzbcmqwq 1444 | data/urehmtzoet 1445 | data/urmgsrkwid 1446 | data/urrcsprniv 1447 | data/urzjldavfo 1448 | data/uttchmlnnv 1449 | data/uuqocrpabe 1450 | data/uurysjbcwn 1451 | data/uuzbemotoh 1452 | data/uvntelzsnn 1453 | data/uvvwjtmbzt 1454 | data/uvwhhohdvp 1455 | data/uwrjugxfeu 1456 | data/uwuytbmjgz 1457 | data/uxsypoielb 1458 | data/uyzwvjizwq 1459 | data/uzbcydhiqb 1460 | data/uzhujugirn 1461 | data/uzjzliaail 1462 | data/uzogcdcdmf 1463 | data/uzzcrwkbin 1464 | data/vadrruqshj 1465 | data/vakqjgammj 1466 | data/vaozzirfnj 1467 | data/vbmciijzwx 1468 | data/vbycfqgyxi 1469 | data/vcfmumdmpt 1470 | data/vcqzdmidpt 1471 | data/vczeeetzpy 1472 | data/vddkwpxfhb 1473 | data/vdmlewddtf 1474 | data/vdpnyzxccm 1475 | data/vdruhipudk 1476 | data/vdzlykljaf 1477 | data/veqmvtcipb 1478 | data/vewoqdyhfb 1479 | data/vewqndwgnj 1480 | data/veyeyosrxz 1481 | data/vfdwndutod 1482 | data/vfhsrhbxxn 1483 | data/vfquueicnw 1484 | data/vfqvqdnjtf 1485 | data/vgcwxcyiof 1486 | data/vindsdwhee 1487 | data/vjljdfopjg 1488 | data/vjqgkscksu 1489 | data/vjujyhfhrz 1490 | data/vkpnerzefy 1491 | data/vkvbafamjp 1492 | data/vlentymfmv 1493 | data/vllyshohnt 1494 | data/vlpxpmswcm 1495 | data/vltsepourt 1496 | data/vltxrrimhw 1497 | data/vlwksozbnm 1498 | data/vmgiqwoyvt 1499 | data/vmiscvenui 1500 | data/vmldsazxrw 1501 | data/vmxpxxuvpp 1502 | data/vnldthxqbz 1503 | data/vnpzvqphkm 1504 | data/vntkhpeycf 1505 | data/vodsjegctz 1506 | data/vodxzvewum 1507 | data/vogwbosucz 1508 | data/vohyklzylo 1509 | data/vpiqmvxclb 1510 | data/vpuxqkpkra 1511 | data/vrfmupvimm 1512 | data/vrndtmconm 1513 | data/vrseszosch 1514 | data/vrtrvkqfio 1515 | data/vsfetmcnjj 1516 | data/vthlyqjjrz 1517 | data/vtpnqkjgvs 1518 | data/vtrlyhhghn 1519 | data/vuaacewavn 1520 | data/vudhvbgulb 1521 | data/vvixicbzkx 1522 | data/vvzssblzxh 1523 | data/vwutuckdhq 1524 | data/vwxxuqutbt 1525 | data/vxfsdxzxnj 1526 | data/vxpvnjllaf 1527 | data/vybdzsvmer 1528 | data/vyleqefdni 1529 | data/vymrbyamcs 1530 | data/vzawfsnetg 1531 | data/vzdlexfsfa 1532 | data/vzhljkqzja 1533 | data/vzxxpzqwcy 1534 | data/wbwipxamgj 1535 | data/wbzlqkabek 1536 | data/wcfiqthqyh 1537 | data/wcpfmnysix 1538 | data/wcuiivptnj 1539 | data/wcyogabfzz 1540 | data/wdleuwxqbi 1541 | data/wdmsbcmkzf 1542 | data/webzbvjxwo 1543 | data/wedzanatii 1544 | data/weeqaeyjgo 1545 | data/wehlixqebk 1546 | data/weizzhbowa 1547 | data/wejmkcaien 1548 | data/wfrkjyusxh 1549 | data/wgifgzkzog 1550 | data/wgntrlqgou 1551 | data/wgnujygkzy 1552 | data/wgqsusjfci 1553 | data/whonhekqwg 1554 | data/whvzrqbyxb 1555 | data/wiaabzyupm 1556 | data/wifosdehgx 1557 | data/wiwdeadthn 1558 | data/wiytaphllp 1559 | data/wjnfhwnoie 1560 | data/wjpbipinqe 1561 | data/wjpxqnomab 1562 | data/wjxyrvwokt 1563 | data/wkfwvzhfpy 1564 | data/wknpfatwev 1565 | data/wkupdirefo 1566 | data/wkwjypymey 1567 | data/wkxouifkzc 1568 | data/wldyporbfz 1569 | data/wllwzkmuza 1570 | data/wloavebugu 1571 | data/wmbkxqteao 1572 | data/wmeblcvpfs 1573 | data/wmgkqogawy 1574 | data/wmxmrtcydt 1575 | data/wmzshvrcgh 1576 | data/wnnfxhrkpk 1577 | data/wnpnagfzxq 1578 | data/wojudxwtqn 1579 | data/wokzyujils 1580 | data/wowbfgzyiz 1581 | data/wpxdrfsmws 1582 | data/wqbfaitajc 1583 | data/wqmfbqogin 1584 | data/wrneqpqrkq 1585 | data/wrwcwnvdhd 1586 | data/wsfdumvwvq 1587 | data/wswmgmtfnc 1588 | data/wszppqgytq 1589 | data/wtjxirptnm 1590 | data/wtsstxpita 1591 | data/wuhsetsmba 1592 | data/wuinmxmupl 1593 | data/wukaqaoorx 1594 | data/wulbfxmthd 1595 | data/wuuynkzrgo 1596 | data/wwmjfkgzyj 1597 | data/wxbtpkhdie 1598 | data/wxgphbzlpn 1599 | data/wxzhbyysjr 1600 | data/wynqlyaexl 1601 | data/wyrtztnqcs 1602 | data/wywmsnneuv 1603 | data/wyzycuhqwx 1604 | data/wzbmpqcdof 1605 | data/wzdybffyzl 1606 | data/xaarfgflox 1607 | data/xasczpanpx 1608 | data/xbdifxrhcd 1609 | data/xbtpvhfgbg 1610 | data/xcmuirlwwe 1611 | data/xdgdhejxes 1612 | data/xdssolqmxa 1613 | data/xdtuvxwenq 1614 | data/xegdbcoscn 1615 | data/xeglvieaar 1616 | data/xehxbtwwjg 1617 | data/xevohgazsq 1618 | data/xfprrrcioh 1619 | data/xfvvpatbef 1620 | data/xgibfzgbun 1621 | data/xgryaftwhr 1622 | data/xgsatjfhrf 1623 | data/xgufzfqvcr 1624 | data/xguuadleva 1625 | data/xhegjwkfaa 1626 | data/xhfbvmlygm 1627 | data/xhnrwjldth 1628 | data/xhsramepav 1629 | data/xhwacojjdg 1630 | data/xikirwouvb 1631 | data/xikpwmuvxy 1632 | data/xiovxhjrtr 1633 | data/xitgdpzbxv 1634 | data/xivfssfypr 1635 | data/xjabnijtoe 1636 | data/xjjndtjnwk 1637 | data/xjshfrgbub 1638 | data/xknliyklhp 1639 | data/xltkixojao 1640 | data/xlvneejsyd 1641 | data/xmbfxuhund 1642 | data/xmlbtgpqfo 1643 | data/xnfwyuxpmw 1644 | data/xnlsovllsp 1645 | data/xoebzwapwo 1646 | data/xoecfwfkwi 1647 | data/xokkkyyagn 1648 | data/xoljaeckui 1649 | data/xowyipikeo 1650 | data/xoyjovtkat 1651 | data/xpsngbdpgk 1652 | data/xptgvykoji 1653 | data/xpukbfhfed 1654 | data/xpxvszxmdx 1655 | data/xqdpvrggxz 1656 | data/xqjoabeqkl 1657 | data/xqrlrmaqzz 1658 | data/xrhbngqlbk 1659 | data/xrltimmbyc 1660 | data/xszsemeklp 1661 | data/xszwbxrtgc 1662 | data/xtnsydjuqs 1663 | data/xtpeyyltfi 1664 | data/xttglwcspr 1665 | data/xuhcvxtzxd 1666 | data/xupeekvvrj 1667 | data/xuqnnutplm 1668 | data/xusmhslwfm 1669 | data/xutzudyhsp 1670 | data/xvxyivgiky 1671 | data/xwbfbueegy 1672 | data/xwnamdbolx 1673 | data/xwndyovxel 1674 | data/xxbpamwotq 1675 | data/xxbunqmupn 1676 | data/xxfytxbwbg 1677 | data/xxigldllip 1678 | data/xxjnvhixka 1679 | data/xxqduonemp 1680 | data/xyjtfubjpn 1681 | data/xyklkuuumr 1682 | data/xylefnjdzx 1683 | data/xyscendxir 1684 | data/xyyzkihhhn 1685 | data/xzcexrifxq 1686 | data/xzdmavxixr 1687 | data/yacilqlipr 1688 | data/yapacvciin 1689 | data/yauttvjxos 1690 | data/yavbbrxkco 1691 | data/ybkekjntal 1692 | data/yblzpeegnk 1693 | data/ybmyhjyabe 1694 | data/ybypmwsjoy 1695 | data/ybzqtyuulg 1696 | data/ychbjvqiju 1697 | data/ychpnlmlkm 1698 | data/ydmftzzrtd 1699 | data/ydntymedcu 1700 | data/ydqovcxvum 1701 | data/ydqvbxdgvr 1702 | data/ydrdwldexh 1703 | data/ydzbpreamo 1704 | data/yevgnmcdin 1705 | data/yfnatzdzen 1706 | data/yfwqckbpkm 1707 | data/yihriwiouk 1708 | data/yijteiprpz 1709 | data/yiuxwriwmc 1710 | data/yizmbpqxqm 1711 | data/yjajbkcpwa 1712 | data/yjkcewkhhn 1713 | data/yjlqmmufse 1714 | data/yjnpygwhsh 1715 | data/ykbygjxhzo 1716 | data/ykgoozqdbb 1717 | data/ykgszzfwhc 1718 | data/ykhcxtzbwt 1719 | data/ykvbsndwvl 1720 | data/ylftubupki 1721 | data/yllyvtyztm 1722 | data/yllztsrwjw 1723 | data/ymghgdxsgx 1724 | data/ymmfejsufe 1725 | data/ynfgxeqzcv 1726 | data/yngjsarkwz 1727 | data/yoijornhmt 1728 | data/ypanvoaglt 1729 | data/ypgayhhaxx 1730 | data/ypmqznhogq 1731 | data/ypnktdctqh 1732 | data/yprcjxgyro 1733 | data/ypsydrqqsl 1734 | data/yqbdslceau 1735 | data/yrjeltmcji 1736 | data/yrrexbomyi 1737 | data/yrrzepqsoz 1738 | data/yrustprntr 1739 | data/yruwgnhqlg 1740 | data/ytycdntzvo 1741 | data/yuniojyjyq 1742 | data/yunzfvsgit 1743 | data/yuvigrauut 1744 | data/yuxlainvfr 1745 | data/yvkuususfu 1746 | data/yvpujjznsn 1747 | data/yvsaqnoixr 1748 | data/yvtzzibsui 1749 | data/yvzauczrmw 1750 | data/ywlbihpkjn 1751 | data/ywlqmtcggy 1752 | data/ywqgpzqnpl 1753 | data/yxdgmeaisq 1754 | data/yxqhxlsngk 1755 | data/yxuszahffr 1756 | data/yxuyvapdid 1757 | data/yyejxatcnz 1758 | data/yynsgccwtn 1759 | data/yysdhxbpsz 1760 | data/yyttdbwmfq 1761 | data/zableigsip 1762 | data/zadumoiiwz 1763 | data/zakfeyskak 1764 | data/zanjisthwk 1765 | data/zaqsqscuhr 1766 | data/zarlwbxxug 1767 | data/zatavvakla 1768 | data/zazfbbafed 1769 | data/zbamwfeoly 1770 | data/zbcyshikxh 1771 | data/zbhqyecfnp 1772 | data/zbmsvslybw 1773 | data/zbqupdrlyd 1774 | data/zcjxupwomg 1775 | data/zcklknuwnq 1776 | data/zcucfxufwz 1777 | data/zcvxxffava 1778 | data/zdieiezcfx 1779 | data/zdkyyawcwe 1780 | data/zfrdomsakt 1781 | data/zgsbhofcsw 1782 | data/zhmaznszye 1783 | data/ziijblwcgv 1784 | data/ziipxxchai 1785 | data/zitraaiwdz 1786 | data/zixatyddzp 1787 | data/zizlnckmtg 1788 | data/zjgcvyfsws 1789 | data/zktuaqrqqv 1790 | data/zlidzhghkw 1791 | data/zlqlajyayj 1792 | data/zmjszxzxpz 1793 | data/zmtbjdustm 1794 | data/zmubddazht 1795 | data/znbkflxgoy 1796 | data/zonckbbvds 1797 | data/zoropdkinx 1798 | data/zpjqhxpuip 1799 | data/zqddpuhqqt 1800 | data/zqebxtuzhn 1801 | data/zqllwscvdy 1802 | data/zrgrcpwvqa 1803 | data/zrqhffmqdi 1804 | data/zrxywvpxnh 1805 | data/zsdgdoluzg 1806 | data/zsivxhdjsd 1807 | data/zsjvxyelva 1808 | data/zsmsxxwnix 1809 | data/zsnnktadbl 1810 | data/zthhinxvap 1811 | data/ztuqdumcag 1812 | data/ztvzwlrqoi 1813 | data/zuvkniwuzf 1814 | data/zuwdyhtvra 1815 | data/zuxcuhuapn 1816 | data/zvekgbrkvh 1817 | data/zvnwnkfbpz 1818 | data/zvohvvrdyz 1819 | data/zvuxjtmtfr 1820 | data/zwlasrtutr 1821 | data/zwrulgwqve 1822 | data/zwvpshcpeb 1823 | data/zwxefbpfee 1824 | data/zwxpyekywc 1825 | data/zxacihctqp 1826 | data/zxigaqsoof 1827 | data/zxkuksycqg 1828 | data/zypkaxiras 1829 | data/zyufpqvpyu 1830 | data/zzaifosmuw 1831 | data/zzcrzuecap 1832 | data/zzogukbedf 1833 | data/qdgpigaalp 1834 | data/temeqbmzxu 1835 | data/hudrinvcyt 1836 | data/eqpnxxliki 1837 | data/mfhhybudyr 1838 | data/pvpwbbfdjq 1839 | data/sruhfgdvrx 1840 | data/guzzjgmmkx 1841 | data/vtadejjbca 1842 | data/bnynincvkz 1843 | data/scihhzghat 1844 | data/bmacjazhyt 1845 | data/acsnnvnvhy 1846 | data/tcktipisad 1847 | data/gsjmdtzrqf 1848 | data/xkwjjjkcam 1849 | data/yqlryxbwhh 1850 | data/vecgvsbzqd 1851 | data/aujiyxfffk 1852 | data/wxjafexjsw 1853 | data/lmrqxokzqo 1854 | data/wveshjdqcm 1855 | data/uxrjifrkkk 1856 | data/tlvronrktg 1857 | data/nrqytqtuox 1858 | data/qmfwopzxet 1859 | data/jfiiefyxyn 1860 | data/bjkjjutppv 1861 | data/rcxjkfdhoe 1862 | data/wvcqevnjta 1863 | data/rfntnnarwd 1864 | data/pyuuehmsva 1865 | data/aesqljtwep 1866 | data/rnoyqvozej 1867 | data/rrznorzbjs 1868 | data/xlxhbvvwor 1869 | data/hoyudeuckw 1870 | data/ufgethuzey 1871 | data/runqlregsp 1872 | data/lmyssukrhn 1873 | data/ekdepvhwxk 1874 | data/ibcnsmcfuj 1875 | data/rgkfjsiyvu 1876 | data/vqzffjrqkt 1877 | data/ecafszsdek 1878 | data/rishvdlhom 1879 | data/bfowhabcyv 1880 | data/srbvyvchmm 1881 | data/hudmutditr 1882 | data/frcluhsyzk 1883 | data/adcnvlhawy 1884 | -------------------------------------------------------------------------------- /reduce_frames.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | mkdir data_30; 3 | 4 | # extract every 10th frame from each video, up to 30 frames 5 | for video in data/*/; do \ 6 | 7 | # extract directory name and create directory in data_30 8 | filename=$(echo $video | awk '{gsub("data/", ""); print}'); 9 | mkdir data_30/$filename; 10 | 11 | for n in $(seq 0 10 299); do \ 12 | # skip a frame if multiple 'faces' were detected for that frame 13 | while [ -f $video$n'_2'.png ]; do \ 14 | n=$((n+1)); 15 | done; 16 | 17 | # move frame to new directory 18 | mv $video$n.png data_30/$filename; 19 | done; \ 20 | echo $video; 21 | done 22 | -------------------------------------------------------------------------------- /train_test_directories.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | #make train and test directories 4 | mkdir train validation test; 5 | 6 | # train-validation-test split. Keeping original files 7 | awk 'NR>1' metadata_train.csv | cut -d ',' -f1 | \ 8 | xargs -a - cp -r -t train; 9 | 10 | awk 'NR>1' metadata_validation.csv | cut -d ',' -f1 | \ 11 | xargs -a - cp -r -t validation; 12 | 13 | awk 'NR>1' metadata_test.csv | cut -d ',' -f1 | \ 14 | xargs -a - cp -r -t test; 15 | -------------------------------------------------------------------------------- /unzip_batch.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # unzip a deepfake-detection-faces-part-i-j.zip file, 4 | # name its associated metadata file with 'metatdata_i-j.csv', and append it to data/metadata.csv 5 | unzip data/deepfake-detection-faces-part-$1.zip -d data; 6 | mv data/metadata.csv data/metadata_$1.csv; 7 | 8 | # Run the following after unzipping everything to obtain a single metadata file: 9 | # cat data/metadata*.csv | grep -v "filename,split,original,label" > data/metadata.csv; 10 | # sed -i '1 i\filename,split,original,label' data/metadata.csv 11 | -------------------------------------------------------------------------------- /zero_pad_file.sh: -------------------------------------------------------------------------------- 1 | # pad single digit filenames (e.g. 6.png) with one zero (e.g. 006.png) 2 | for file in data_30/*/[0-9].png; do \ 3 | path=$(echo $file | awk '{gsub("[0-9]+.png", ""); print}'); 4 | new_file_name=$(echo $file | awk '{gsub("data_30/.*/", ""); print}' | \ 5 | awk '{print "00"$1}'); 6 | 7 | mv $file $path$new_file_name; 8 | echo $path$new_file_name; 9 | done; 10 | 11 | # pad double digit filenames (e.g. 10.png) with one zero (e.g. 010.png) 12 | for file in data_30/*/[0-9][0-9].png; do \ 13 | path=$(echo $file | awk '{gsub("[0-9]+.png", ""); print}'); 14 | new_file_name=$(echo $file | awk '{gsub("data_30/.*/", ""); print}' | \ 15 | awk '{print "0"$1}'); 16 | mv $file $path$new_file_name; 17 | echo $path$new_file_name; 18 | done; 19 | --------------------------------------------------------------------------------