├── .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 | " filename \n",
63 | " split \n",
64 | " original \n",
65 | " label \n",
66 | " \n",
67 | " \n",
68 | " \n",
69 | " \n",
70 | " 0 \n",
71 | " bztdemptfg.mp4 \n",
72 | " train \n",
73 | " exxqlfpnbz.mp4 \n",
74 | " FAKE \n",
75 | " \n",
76 | " \n",
77 | " 1 \n",
78 | " qarqtkvgby.mp4 \n",
79 | " train \n",
80 | " NaN \n",
81 | " REAL \n",
82 | " \n",
83 | " \n",
84 | " 2 \n",
85 | " kujvvxpted.mp4 \n",
86 | " train \n",
87 | " fdpisghkmd.mp4 \n",
88 | " FAKE \n",
89 | " \n",
90 | " \n",
91 | " 3 \n",
92 | " avznxuwvbx.mp4 \n",
93 | " train \n",
94 | " dpevefkefv.mp4 \n",
95 | " FAKE \n",
96 | " \n",
97 | " \n",
98 | " 4 \n",
99 | " ehfmarmsvo.mp4 \n",
100 | " train \n",
101 | " jawgcggquk.mp4 \n",
102 | " FAKE \n",
103 | " \n",
104 | " \n",
105 | "
\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 | " filename \n",
199 | " n_frames \n",
200 | " \n",
201 | " \n",
202 | " \n",
203 | " \n",
204 | " 0 \n",
205 | " data/aaagqkcdis/ \n",
206 | " 276 \n",
207 | " \n",
208 | " \n",
209 | " 1 \n",
210 | " data/aaaoqepxnf/ \n",
211 | " 300 \n",
212 | " \n",
213 | " \n",
214 | " 2 \n",
215 | " data/aabdnomlru/ \n",
216 | " 300 \n",
217 | " \n",
218 | " \n",
219 | " 3 \n",
220 | " data/aabqyygbaa/ \n",
221 | " 300 \n",
222 | " \n",
223 | " \n",
224 | " 4 \n",
225 | " data/aafezqchru/ \n",
226 | " 300 \n",
227 | " \n",
228 | " \n",
229 | "
\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": "iVBORw0KGgoAAAANSUhEUgAAAZUAAAESCAYAAAA17khbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvDW2N/gAAIABJREFUeJzt3XmcXFWZ//HPU1VJp9OdJisJCUtYEpYgiTNhRBDEURQRBxRXEMEZicLPGUdwGB1FEZlBcKKMigKCwyoKDiAQkU0FImtAQxISQiALabJ30unu9Fr1/P44t5rqSvWWrrqdrnzfr1e9OnXuqVvnXop66uzm7oiIiBRDYrALICIi5UNBRUREikZBRUREikZBRUREikZBRUREikZBRUREikZBRUREikZBRUREikZBRUREiiY12AWI2/jx433q1KmDXQwRkSHjhRde2OzuE/qSd48LKlOnTmXBggWDXQwRkSHDzFb3Na+av0REpGgUVEREpGgUVEREpGgUVEREpGgUVEREpGhiDypmNtbM7jGzJjNbbWZndpPPzOxKM9sSPa4yM4uOHW9mjXkPN7Mz4r0aERHJNRhDiq8B2oCJwCxgnpktdPclefnmAKcDMwEHHgFeB6519yeB6mxGMzsRuB/4fclLLyIi3Yq1pmJmVcAZwCXu3uju84H7gLMLZD8HmOvua929FpgLnNvNqc8BfuPuTSUotoiI9FHczV/TgbS7L89JWwjMKJB3RnSsx3xmNhL4GHBzEcspZeLyB17m3+5a2HtGESmKuJu/qoH6vLR6YFQf8tYD1WZm7u456WcAm4HHu3tTM5tDaE5j//3334Viy1D1yoYG6pvbB7sYInuMuGsqjUBNXloN0NCHvDVAY15AgdD0dUuB9E7ufr27z3b32RMm9Gn5GikTHWmnI93tR0NEiizuoLIcSJnZtJy0mUB+Jz1R2sye8pnZfsCJwC3FLaaUi7Q7me5/b4hIkcUaVKKO9LuBy8ysysyOA04Dbi2Q/RbgQjObYmaTgYuAm/LynA085e6vlbDYMoSlM046o6AiEpfBmPx4AVAJbATuAM539yXZuSc5+a4jDBNeBCwG5kVpuT6LOuilBwoqIvGKfZ6Ku9cR5p/kp3eZexL1kVwcPbo712GlKKOUj4w7aTV/icRGy7RIWetIq6YiEicFFSlrGVdQEYmTgoqUNfWpiMRLQUXKWjqjIcUicVJQkbKWVvOXSKwUVKSspTNOh4KKSGwUVKSspTNORkFFJDYKKlLW0hnNUxGJk4KKlDUNKRaJl4KKlLUODSkWiZWCipS1MKQYetgZQUSKSEFFylq2k161FZF4KKhIWcsOJ1ZnvUg8FFSkrGVn02cyg1wQkT2EgoqUtbRqKiKxUlCRsuUeOukB0tqnXiQWCipStnI751VTEYmHgoqUrdxAotFfIvFQUJGy1aWmoqAiEgsFFSlbav4SiV/sQcXMxprZPWbWZGarzezMbvKZmV1pZluix1VmZjnHk2Z2uZm9aWYNZvYXMxsd35XI7i53GLFWKhaJR2oQ3vMaoA2YCMwC5pnZQndfkpdvDnA6MBNw4BHgdeDa6Ph3gGOBdwJrgBlAS8lLL0NGR05U0Z4qIvGItaZiZlXAGcAl7t7o7vOB+4CzC2Q/B5jr7mvdvRaYC5wbnWcM8K/Aee6+2oPF7q6gIp3UUS8Sv7ibv6YDaXdfnpO2kFDLyDcjOlYo39uADuBjZrbezJab2f8rRYFl6OrS/KU+FZFYxN38VQ3U56XVA6P6kLceqI76VfYF9iIEqQOBacBjZrbc3R/JP5GZzSE0p7H//vsP9BpkiMht/lJNRSQecddUGoGavLQaoKEPeWuARg9rmDdHaZe5e7O7vwT8Cjil0Ju6+/XuPtvdZ0+YMGFAFyBDR25NRUFFJB5xB5XlQMrMpuWkzQTyO+mJ0mZ2k++l6K++KaRb6lMRiV+sQcXdm4C7gcvMrMrMjgNOA24tkP0W4EIzm2Jmk4GLgJui87wGPAl8w8wqzOxw4JPAAzFchgwR6dzmL/WpiMRiMCY/XgBUAhuBO4Dz3X2JmR1vZo05+a4D7gcWAYuBeVFa1qeBA4At0bFL3P2xGMovQ0RazV8isYt9noq71xHmn+SnP0nonM8+d+Di6FHoPLXAySUqppQBLdMiEj8t0yJlKzeQaEa9SDwUVKRs5fajaEa9SDwUVKRsaUFJkfgpqEjZUvOXSPwUVKRsqaNeJH4KKlK2Mpr8KBI7BRUpWx3qUxGJnYKKlK2Mmr9EYqegImVLfSoi8VNQkbLVoaAiEjsFFSlbuR312qRLJB4KKlK2cmsnmlEvEg8FFSlbmvwoEj8FFSlb6qgXiZ+CipStLjs/KqaIxEJBRcpW15pKpoecIlIsCipStroGlUEsiMgeREFFylaXjnoNKRaJhYKKlK0uQ4rVqSISi9iDipmNNbN7zKzJzFab2Znd5DMzu9LMtkSPq8zMco57dI7G6HFDfFchQ0GXVYpVUxGJRWoQ3vMaoA2YCMwC5pnZQndfkpdvDnA6MBNw4BHgdeDanDwz3X1F6YssQ1GH5qmIxC7WmoqZVQFnAJe4e6O7zwfuA84ukP0cYK67r3X3WmAucG5shZUhTzPqReIXd/PXdCDt7stz0hYCMwrknREd6ynfE2a23szuNrOpxSyoDH3Z2smwpKmjXiQmcQeVaqA+L60eGNWHvPVAdU6/yruBqcBhwJvAA2ZWsDnPzOaY2QIzW7Bp06YBFF+Gko7OoJLQjHqRmMQdVBqBmry0GqChD3lrgEb38JPT3Z9w9zZ33wZ8GTgQOLzQm7r79e4+291nT5gwYaDXIENExh0zSCVMQUUkJnEHleVAysym5aTNBPI76YnSZvYhX5YD1sNx2cOkM07SjKSCikhsYg0q7t4E3A1cZmZVZnYccBpwa4HstwAXmtkUM5sMXATcBGBmM8xslpklzaya0IlfCyyN4zpkaEhnnGQiCirqUxGJxWBMfrwAqAQ2AncA57v7EjM73swac/JdB9wPLAIWA/OiNAjDkX8NbCcMM54KnOru7bFcgQwJuUFFQ4pF4hH7PBV3ryPMP8lPf5LQOZ997sDF0SM/7x+AQ0tYTCkDaY+av8w0pFgkJlqmRcpWOuMkk0ZCNRWR2CioSNnKdtSn1KciEhsFFSlbGXcSiVBTUfOXSDwUVKRsdaSdVCL0qaj5SyQeCipSttLuJDRPRSRWCipStjK5Q4rVpyISi34FFTM7qVQFESm2jkzU/KU+FZHY9Lem8pCZrTCzfzMzLaIlu7XOjnpT85dIXPobVP4eeB74LvCGmf3SzN5d/GKJDFzukGI1f4nEo19Bxd3/5O6fBqYAlwCzgT+a2VIz+7KZjSlFIUV2RXaZlkTCtEe9SEx2qaPe3be4+/fdfTpwErAZ+AFQa2Y3mdnbillIkV3RufaXqaYiEpcBjf4ys1OAfwGOISwQeQth86wXzez8gRdPZNelHRIJI5VUn4pIXPodVMxskpl9w8xWAg8Ao4HPAPu5+xeBQwirCX+rqCUV6ad0JkNKHfUiserXKsVm9n/AqUALcBvwU3fvsnGWu6fN7JeEJe5FBk2XTbrU/CUSi/4ufT8N+FfgVndv7CHfIuA9u1wqkSLIZCCRIKqpDHZpRPYM/Q0qpwLrCm2GZWYpYLK7r3H3BuDxYhRQZFd1ZDKMTKXCkGI1f4nEor99KiuBt3dzbGZ0XGS3kO2oDzPqVVURiUN/g4r1cGwYoP9zZbeRyThJC4FFFRWRePTa/GVmo4GxOUlTzOygvGyVwDnA+iKWTWRAOjJOMpEIm3QpqojEoi99Kl8Gvg149PhNN/ksyieyWwirFKMhxSIx6ktQuRdYRQgavwAuB17Ly9MKvOzuL/V2MjMbC9wIvJ8wE//r7v7LAvkM+B7w+SjpRuDf3buODTWzc4CbgPPc/YY+XI/sIdLupBIJkgkUVERi0mtQcfeFwEIAM3NgnrtvHsB7XgO0AROBWcA8M1uYP98FmAOcThgA4MAjwOvAtdkM0VpjXwfyXytCOuNRR31C81REYtLfBSVvHkhAMbMq4AzgEndvdPf5wH3A2QWynwPMdfe17l4LzAXOzctzBfAjQo1HpIt01FGvmopIfPrSUf8H4AJ3Xxb9uyfu7u/t4fh0IO3uy3PSFhLWC8s3IzqWm29GTrn+jrBK8gXAJ3opl+yB0lFHfVJ9KiKx6UtNJXcYcSJ63t2jt/NVA/V5afXAqD7krQeqLUgCPwX+2d17HcZsZnPMbIGZLdi0aVNv2aVMpLMd9Zr8KBKbvvSpvCfn3ycO8P0agZq8tBqgoQ95a4BGd3czuwB4yd2f7subuvv1wPUAs2fP1rfLHiLtYen7lNb+EonNgJa+3wXLgZSZTctJm0nhjvYl0bFC+d4LfMTM1pvZeuBYYK6Z/aQEZZYhKpO7SZdqKiKx6FdQMbPTzOxzOc8PMLOnzazBzH5jZtU9vd7dm4C7gcvMrMrMjgNOA24tkP0W4EIzm2Jmk4GLCEOHIXTYH04YPTYLWAB8B/hGf65HyltHdpViU/OXSFz6W1P5JjAh5/kPgH0JTUsnAJf24RwXEGbgbwTuAM539yVmdryZ5a58fB1wP2HF48XAvCgNd9/m7uuzD8IQ5e3unt9fI3uwTDSkWM1fIvHp7yrFBwMvAZhZJXAK8Fl3v8vMlhLmjHy1pxO4ex1h/kl++pOEzvnscwcujh49KkJfj5ShMPkxNH+5vxVkRKR0+ltTGQE0R/8+lhCUHo6evwJMLlK5RAasIzv50UIgUW1FpPT6G1RWAe+K/n0a8EJOk9Pe7DxcWGTQZLJ9KskoqKhfRaTk+tv8dR3w32b2EUIH+fk5x94JvFysgokMVLb5q7OmoqAiUnL9Ciru/j9mthk4BviRu9+Sc3gUb43OEhlUmYzjOZt0gZq/ROLQ35oK7n47cHuB9C8UpUQiRZANIEkzElFNRcOKRUqv30Ely8z2JnTcd+HuawZUIpEiyDZ1JZNGSn0qIrHpV1Axsxrgf4BPAhXdZEsOtFAiA9UZVHJqKgoqIqXX35rKNYSl628kTEpsLXqJRIqgs/lLfSoisepvUPkA8G/ufk0pCiNSLNn+ky5BRTUVkZLr7zwVI0xyFNmtdeQGFTV/icSmv0HlV8CHS1EQkWLK1lQSppqKSJz62/z1MHC1mY0CfgfU5Wdw9952hxQpuWxNJZXT/JVRn4pIyfU3qPw2+nsgXfeLd0LTmKPRX7IbyNZKukx+7HWPUBEZqP4Glff0nkVk8GUKTH7syCiqiJRaf5dpebxUBREpps7mr2RO85diikjJ7dKMejMbT1j/axxwv7vXmdkIoM3d9b+uDLrcjvqU5qmIxKa/2wmbmX0fWAvcB/wCmBod/i3azld2E7mTHxOdfSr6vSNSav0dUvx14EvAZcA7CJ3zWfcDpxapXCID0pEuNE9lMEsksmfob/PX54HL3P0KM8sf5bWCsN2wyKDL7ajXPBWR+PS3pjIFeKabY21A1cCKI1IcaS3TIjIo+htUaoEjuzk2E1jZ2wnMbKyZ3WNmTWa22szO7CafmdmVZrYlelxlFtoxzGy8mf05St9mZk+b2XH9vBYpY12DSpSmjnqRkutvULkL+FbeF7ib2XTgIsIyLr25hlCrmQicBfzMzGYUyDcHOJ0QrI4i9NdkNwJrBP4RmACMAa4E7jezXd4fRspL16ASPubapEuk9PobVC4FlgFPAK9GaXcRlsF/FfheTy82syrC0vmXuHuju88njCI7u0D2c4C57r7W3WuBuUSz+N29xd1fiYYvG5AmBJex/bweKVNdlr7XgpIisenv5MdmMzsR+DRwMqFzfgvwXeB2d+/o5RTTgbS7L89JWwi8u0DeGdGx3HxdajRm9hJwGDAMuMHdNxZ6UzObQ6j5sP/++/dSRCkHuTWVqKLSOSFSREqnvzs/jgBmEzbnuhdYB7zg7i19PEU1UJ+XVg+M6kPeeqDazMw9/Ax196OiMn0EGN7dm7r79cD1ALNnz9Y3yx4gXWCVYi0oKVJ6fQoqZlYBXAWcx87bCLeY2c+A/3D3tl5O1QjU5KXVAA19yFsDNGYDSlYU0O4ws6Vm9ld3z63dyB4qG0BSiZwZ9aqpiJRcr0ElGnH1APD3hFnzvwPWEPoy9iN0oH8FOAI4pZfTLQdSZjbN3bN9MjOBJQXyLomOPddLvqxhwEF0bTKTPVTu5EftUS8Sn77UVD5GWJ34Y+5+T4HjN5jZR4E7zeyj7n53dydy9yYzuxu4zMw+D8wCTgOOLZD9FuBCM/sdYUn9i4AfA5jZMVHZnyMstf8vhNFkz/bhemQPkK2paJMukXj1ZfTXp4E7uwkoAESB5C7CEOHeXABUAhuBO4Dz3X2JmR1vZo05+a4jLP2yCFgMzIvSIDTBXUMYJFBLqCF9yN3f7MP7yx4guyRL7irFmqciUnp9qam8HfhmH/I9AFzeWyZ3ryPMP8lPf5LQOZ997sDF0SM/7+OE5jCRgrJ7p6imIhKvvtRUJhD6UHqzBth7YMURKY6M5qmIDIq+BJWRhCHEvWkDRgysOCLF0dn8pT3qRWLV13kqU8zsoF7y7DvQwogUS3bvlIQWlBSJVV+Dym/6kMcIo7REBl22ppK03E269PEUKbW+BJXPlbwUIkWmtb9EBkevQcXdb46jICLFlI6qKl32U1GfikjJ9XeVYpEhIZpQ33Xnx7SCikipKahIWcrunZJM5jR/qaYiUnIKKlKWssvcZzvqzbRJl0gcFFSkLHWu/RV9wpNm2k9FJAYKKlKWsiO9UlFUSSRMzV8iMVBQkbLU0blJV3ieSpiav0RioKAiZSmTcRIGFnXSJ806J0SKSOkoqEhZSrt3Nn1B1PyVUVQRKTUFFSlL6YyTE1NIqk9FJBYKKlKW0hnvnJ8CUVBRRUWk5BRUpCylM945kx6yfSqKKiKlpqAiZWmnoKKaikgsFFSkLKV956CiTbpESi/2oGJmY83sHjNrMrPVZnZmN/nMzK40sy3R4yqLxoea2XQz+62ZbTKzOjN7yMwOjfdKZHeWKVBT0Yx6kdIbjJrKNYSthycCZwE/M7MZBfLNAU4HZgJHAacCX4iOjQbuAw6NzvMc8NvSFluGko68jvqE1v4SiUWsQcXMqoAzgEvcvdHd5xOCw9kFsp8DzHX3te5eC8wFzgVw9+fc/UZ3r3P3duCHwKFmNi6WC5HdXibjnTs+QliuRZt0iZRe3DWV6UDa3ZfnpC0ECtVUZkTHessHcAKw3t23FKWUMuSFyY85NRXNUxGJRdxBpRqoz0urB0b1IW89UJ3tV8kys30JTWoXdvemZjbHzBaY2YJNmzbtUsFlaOnIq6kkE9pOWCQOcQeVRqAmL60GaOhD3hqg0f2tn5tmNgF4GPipu9/R3Zu6+/XuPtvdZ0+YMGGXCy9DRybTtaYS5qkoqIiUWtxBZTmQMrNpOWkzgSUF8i6JjhXMZ2ZjCAHlPnf/zxKUVYawdMZJmIYUi8Qt1qDi7k3A3cBlZlZlZscBpwG3Fsh+C3ChmU0xs8nARcBNAGZWAzwE/NndvxZL4WVIKTT5sUN71IuU3GAMKb4AqAQ2AncA57v7EjM73swac/JdB9wPLAIWA/OiNICPAEcDnzOzxpzH/rFdhezWduqoN3XUi8QhFfcbunsdYf5JfvqThM757HMHLo4e+XlvBm4uYTFliEvnDylOGq3tWqdFpNS0TIuUpfxVihPao14kFgoqUpYK9amoo16k9BRUpCzlB5VUQkOKReKgoCJlKX+V4oTmqYjEQkFFylKhVYoVVERKT0FFytJOqxRr7S+RWCioSFnaaUhxwrT0vUgMFFSkLGV857W/NKRYpPQUVKQs5a9SnFBNRSQWCipSljJ5fSop9amIxEJBRcpSwU26VFMRKTkFFSlL6XTeJl2apyISCwUVKUtp79r8pXkqIvFQUJGylM5AMpm/9tcgFkhkD6GgImUpncnsVFPpyGjpe5FSU1CRspS/oGTCDMUUkdJTUJGylHF2XqU4GlJ81g3PcOszqweraCJlTUFFylJHJtO1phJ11G9vaefPK7bwl9VbB7F0IuVLQUXKUiYTmryysv0rr25oBKC+uX1QyiVS7hRUpCzlT35MRSPBXlnfACioiJRK7EHFzMaa2T1m1mRmq83szG7ymZldaWZbosdVZm/99DSz683sFTPLmNm5sV2A7PbcfadVirO1luUbFFRESmkwairXAG3AROAs4GdmNqNAvjnA6cBM4CjgVOALOccXAhcAL5a0tDLkZOejdB1SHP4qqIiUVqxBxcyqgDOAS9y90d3nA/cBZxfIfg4w193XunstMBc4N3vQ3a9x98eAltKXXIaS7Mz5VJfJj+GjrqAiUlpx11SmA2l3X56TthAoVFOZER3rLV+vzGyOmS0wswWbNm3alVPIEJINKl076sPfzY1tVKQStHZkaGlPD0bxRMpa3EGlGqjPS6sHRvUhbz1Qnduv0lfufr27z3b32RMmTOjvy2WIyc5HSeZ8unOHF8/cdzSg2opIKcQdVBqBmry0GqChD3lrgEZ3bYohPcvWVLJNXkCXTvu/nToGUFARKYW4g8pyIGVm03LSZgJLCuRdEh3rLZ9IF51BJadOmx1ebAaz9lNNRaRUYg0q7t4E3A1cZmZVZnYccBpwa4HstwAXmtkUM5sMXATclD1oZsPNbARgwDAzG2FmmncjOTWVnYcUTxldyaSaEQDU71BQESm2wfgSvgCoBDYCdwDnu/sSMzvezBpz8l0H3A8sAhYD86K0rIeBZuBY4Pro3yeUvviyu8v4zs1f2QBzyN7V7FU5DFBNRaQUUnG/obvXEeaf5Kc/Seiczz534OLoUeg8J5aoiDLELXxjGwBVFcnOtM6gMkFBRaSU1FwkZaWuqY3/uGcxh00axclHTupMzwaVg/eupkZBRaRkFFSkbLg737x3EfXNbfzgE7OoSL1VUxkejS+etnc1yYQxakRKQWU3dMdza3jqtc2DXQwZAAUVKRsPLVnP7xat5ysnTeeIyV1Hrp8wfQLf++jb+Jv9w3DivSqHKajsZtyd/5y3lJ8/8fpgF0UGIPY+FZFS+fOKLYwakeILJxy807ERw5J86u/273yuoLL72dzYRmNrB69ubOw9s+y2VFORslG7rZl9x4zsMpS4Owoqu59VW5oAWLu1mR1tHYNcGtlVCipSNmq3NjNldGWf8o4eqaCyu1m5qanz3ytUWxmyFFSkLLh7VFPpW1BRTWX3s3LLW0Elu0OnDD0KKlIWtjd30Nja0eeaSk0UVLJLyW1ubEXLyg2ulZua2H/sSIYlTf0qQ5iCipSFtdt2ADClHzWVto4MLe0Z1te38M4rHuOhJetLWUTpxaotTUzbu5qDxlezYmOhNWZlKFBQkbJQu7UZoM81ldxZ9Ytq62lPOy+u2Vay8knPMhln1ZYmpo6v4pCJ1aqpDGEKKlIWardFQaUfNRUIQSW7G+Qr6/XreLCs395CS3uGA8dXMW3vatbU7dAmakOUgoqUhdqtzYwYlmBc1fA+5R9dGfLVN7d3BpNscJH4rdocOulDUBmFO7y2SbWVoUhBRcrCm/XNTB5dSV83Bi1UU1lX36Ll8AfJ61FQmTq+imkTw7qyGlY8NCmoyJC0uLaeY694jLVbQwd9f+aowFtBZUtjK69tauSwSWFH6+XqIB4UqzY3UZFKsE/NCKaOqyKZMA0rHqIUVGS319qR5sI7/8qy9ds70+YtWseb9S08tnQjQL/mqMBbQeWvb2yjPe18eOZk4K1+lcW19Xz4x/PZ0tharMuQHqza0sTUcVUkEsbwVIKp40ayfEMDG7a38N0HXublN7f3fhLZLSioyG7vD0s3cveLtdzy9OrOtD+vCCvZzl+xmZb2NJsb25i8V9+DyqgRKczguVV1AJx46ARGVaQ6m8J+9fwaFtXW89CSDUW8EunO65ubOHB8VefzaXuP4tmVdbzvB49z4/yVfPYXz7I6Z3Kk7L4UVGS309Ke7jIR8d6/1gLw6MsbyGScbTvaWFRbz7Ck8cxrW3ijrn9zVAASCWNURYrXNzWRTBgHT6hm+qRRvLK+gUzGeTgKJo8tVVAptY50hjfqdjA1J6gcOmkU9c3tHL5PDf977tGkM85nf/Ecr6xv4JGXN3Dr06to68gMXqGlW1qlWAbV069toa6pjQ8dtQ8AO9o6OPnqJ5l9wBh+8MlZ1O9o54/LNjFldCW125p5qbae9fXNuMNZ7ziAm55axYOLw6TF/vSpAIweOZztLR1MHTeSEcOSTJ84igcXr+Ova7exsaGVffYawfwVm2luS1M5PNn7CWWX1G5rpj3tHJQTVP7p+AP52wPG8K5DxpNIGDeeezRn/vwZPnD1E515WjsyfP74gwajyNID1VRk0GxtauOLt73AP9/xYucWwNc+/jpr6nZw919qefq1LTy4eB1t6Qz/9dG3kUwYj768gfkrNlM1PMkFJ4Yl7u964Q2gfzUVeKtf5dCok/7QidVs29HObc+sJpUwvvGhw2ntyHQ2tb26oYE7F7zR5RyNrWF5GNl1tz0TmjWnR/8dAGpGDOOE6RNIRCtO/83+Y7jzC+/k2x8+gru++E6OO2Qc1/xxBdtbNFpvdxN7UDGzsWZ2j5k1mdlqMzuzm3xmZlea2ZbocZXljBc1s1lm9oKZ7Yj+zorvKmRXPPXaZr5+96LOL4IfPrqchpZ2xlYN59//7yXWbNnB9U+8xvuPmMiU0ZV85/4l3P1iLQeOr+KEaeM5euoYHnl5A39esYV3HDSOvWtGcMQ+NbxR10wyYUyqGdGv8mSDyvSJ4css+6X227++yTEHjeP9R0yiuiLFY8s2sKOtg3+8+Xku/s1L/H7xOgAaWtr50I+e5NQfPUlDzpfb069tYcP2lgHfrz3BrU+v4udPruTsYw5g5r579Zj3qH1H87njDuToqWP52smHs3VHuzb02g0NRk3lGqANmAicBfzMzGYUyDcHOB2YCRwFnAp8AcDMhgO/BW4DxgA3A7+N0qWEWtrT/ODhV/jls2u69HvUbmumteOtGdC/fn4N7/ivR7nnL2sBePnN7Zx38wLueG4Nn7nhWZ5bWcftz67hrHcdxiA6AAATCklEQVQcwBUfPYpl6xs449qnyDh868NH8B+nHM6y9Q08t6qO02ZNxsx43+ETeWVDAys3N3HcIeMBeNe08HdSzQhSyf59nDtrKhNHdfmbzjgfmDGR4akEJ0wfz2NLN/K9B5fxRl0z+42t5Jv3LmZrUxvfvHcxb9TtYE3dDr5572LcnVufXsWnf/4MH/3pU53DnRetreecXzzHIy+/1T8z/9XNXHjnX7t0PnekMzS39X8WubuzcnMTHends4+hPZ3h9mdX89W7FnYJtvcvfJNv37eE9x2+N9/+8BF9nmME8LZ99+LUo/bhhidXsrFBAXx3EmufiplVAWcAR7p7IzDfzO4Dzga+lpf9HGCuu6+NXjsXOA+4FjiRUParPXyz/cjMvgr8PfD7UpT9jbodVFekqKkcRsJCs0dDSwdVw1OMGpEi407djjYaWzoYWzU8LFiYzrClsY3Wjgzjq4dTXZGiuT3N5oY2zGDCqAoqUgnqmtpYv72FquEpJu01glTC2NDQyqaGVsZVDWdizQia29O8uqGBTQ2tHDihigPHV7FxeysL125jR2uaI6fsxSF7V/PmtmaWrd/OjrY0lcOSNLR28MdlG5m/YjOT96rkhOnjOXB8NRu2t7BtRxtH7Tua46eNZ+XmJn71/BssXbedU962Dx95+xSWvLmduxa8QUNLBx/5mykcNmkUX797EcuiYbd/WLaB844/iOueeJ0/LNvIlNGVXHjSdJZvbOC6x19nr8phfOXXC1lSu50HXlrHqBHDuOTUI/jWb5fwyeufZlRFiq+cNJ2xVcM59ah9eOCldVxw4sHsO2YkU0ZX8o4Dx/LsyjpOmzUFgJOOmMjl85YC8K4oqBx3yHiuf+L1fvenQFipGN6qoYyrrmB8dQWbG1s56YhJALz3sIn8btF6bnl6NeceO5VPzN6Pf/jJfD5+3dOs2NjIRSdNx4EfPLKcdMZ54KV1HHvwOBbX1nPmz5/lM8fsz38/vJyOdIbHl2/i/BMPJmnGNX9agTs8smQDl3/kSJpa01zzxxVsamzlzL/bn88dN5XFtdt54KU3SSaMf5g5mVn7j+axpRt55OUN7DumktNmTaYj7Vz10Cu8sHorE2sq+MTs/Zg6ropVW5rYtqOdI6fUcOSUvXj5ze38fvF6Glo7OH3WFD545CRWbmni2dfr6EhnOHBCFVXDU7y4ZisvrtmKewi6w5IJdrSl6chkOGrKXhx7yHgOGDeShBltHRnWb2/hzW3NrK9vYV19+Ey1ZxwcxlYNZ0zVcO5f+CYrNzeRMPjDso1897QjeXTpBu75Sy2z9hvNjz799n7/IAD46vsP5feL1/PBq5/kyCl7ceSUGo45aByzDxhLa0eaNXU72NLYRnN7mu3N7byxdQdv1DVTOSzJAePDZ2zk8BQjhyepHJ7s/H95zMjhBfvQ3J2MQ8adVMI6g2A647SnMwxPJjqb69o6MqQzTkUqpLk7Le0h6I8YlsDMSGecHW0dDEsmqEiFtLaO8MOiYlhIA2hpz9DSnmZkRZKKVJKOdIbtLR20pzPsVTmMEcOSNLS0s2F7K2bhB9bI4Um2N3ewqbGVyuFJJlRXMDwVTx3C4lzu28zeDjzl7pU5aV8F3u3uH87LWw+8392fjZ7PBv7o7qPM7CvRsQ/m5H8gOj63pzLMnj3bFyxY0O+yH/Gt37Mj+hWZShgdmbfuWzJhZNzJvZX5eQCGJY32dNe0QvkSBrlJZjCQ/0wTayp49/QJ1G5r5vmVW2lLZzCDymHJzmsCGFWRYvqkUbywemuX19aMGNa5wN+4quH898dnsmpLE1f8bhlt6QyjRqT47DsP4Inlm1lUWw/AZ47Zn2+ccgTfvm8xdy5YS9XwJHd98ViOmFzD/Fc3c8HtL/C1Dx7Ome8IW/xubWrjzgVv8JljDqCqIvzWeXNbMy+u2cqpR03uLM/7f/g4dU3tPP+N92JmNLelmfmdh/nQUfvww0/2rwX0p39awfVPvM6Cb7yv80vtC7cuYNuOdn79hXcCUNfUxuzLH2HKmEoe+tcTGDk8xdWPLufqR1/lmIPGcvvnjwHgrBue4ZnX6zjx0Alcd/bfsnRdA5+54VkaWzs4ftp4rvrYUfzosVe547nQJ/OJ2fty3vEH8e//91LnQpaz9hvNwROq+e1fazs/E3uPqqAj49Q1tXWWe7+xlWzc3kprNPpp71EVnHPsVF5YvZU/vbKRjIfPZOWwZJf+nvAlmuxxscZkwjh8n1FUpJJsb26nPZ1h5PDwo2n5hgYyPXwOR1WkGF0VApEBW5ra2LajnekTq7n4A4cxdfxIvvTLv7BsfQOphHHBew7hS+85ZEBfdo8t3cC8RetYuq6B5RsaSGe82/9fkglj8ugRNLdl2NzL/KPh0ech4x49CuSJyp07Cq0ilSCd8S7/T1ekErSlM51lMgvnb815XTJhJM1oy6ltDksa7nQ5V6HvkL5+r+w3tpInL/77Hq+7O2b2grvP7lPemIPK8cBd7j4pJ+084Cx3PzEvbxqY4e7LoufTgOWEJrtvRsc+lZP/duBVd7+0wPvOITSnARwKvDKAyxgPbB7A68ud7k/PdH96p3vUs8G4Pwe4+4S+ZIx7SHEjUJOXVgMUWhsjP28N0Ojubmb9OQ/ufj1w/S6VOI+ZLehrxN4T6f70TPend7pHPdvd70/cHfXLgVRU68iaCSwpkHdJdKxQviXAUda1Z++obs4jIiIxiTWouHsTcDdwmZlVmdlxwGnArQWy3wJcaGZTzGwycBFwU3TsT0Aa+BczqzCzL0Xpfyhl+UVEpGeDMaT4AqAS2AjcAZzv7kvM7PioWSvrOuB+YBGwGJgXpeHubYThxp8FtgH/CJwepZdaUZrRypjuT890f3qne9Sz3fr+xNpRLyIi5U3LtIiISNEoqIiISNEoqPRRX9csK1fRgIgbo2tvMLO/mFnu5NP3mtmyaC22P5rZAXmv/YWZbTez9WZ24eBcRTzMbJqZtZjZbTlpZ0b3rsnM7jWzsTnH9pjPlpl9ysyWRtf6WjR3TZ8fwMymmtnvzGxrdJ0/MbNUdKzbtQ57Wycxdu6uRx8ehEEFvwaqgXcB9YQJmINetpiuvwq4FJhK+DFyKmFe0FTCZKx64OPACOD7wDM5r70CeJKwTtvhwHrg5MG+phLeq4ej670tej4julcnRJ+fXwK/2tM+W8BJwGrgmOgzNCV66PMTrvN3hBGuI4BJhEFK/wIMj+7bV4CKKG01MDx63RcIE7r3je7ny8AXB+06BvtGDoVH9IXaBkzPSbsV+N5gl22Q78tLhLXc5hCW38m9X83AYdHzWsKyOtnj3839Ui2nB/Ap4M4oAGeDyn8Bv8zJc3D0eRq1J322gKeAfyqQrs9PuK6lwCk5z79PGPH6/ugeWM6xNdnAGt3XOTnH/ik3KMf9UPNX30wH0u6+PCdtIeEX6B7JzCYS7ssSwn1YmD3mYT7Sa8AMMxsDTM49TpneOzOrAS4jzKnKlX9/XiMKJOwhny0zSwKzgQlmtsLM1kbNO5Xo85P1P8CnzGykmU0BPkhYIHcG8JJHESPyEm/dgy73j0G+PwoqfVNNqJ7nqif80tzjmNkw4HbgZg9rs/V0f6pznucfKzffBW509zfy0nu7P3vCZ2siMAz4GHA8MAt4O2EdP31+gscJwWA7sBZYANxL75+R/OP1QPVg9asoqPRNv9YaK2dmliA0z7QB2ZUMero/jTnP84+Vjajj9H3ADwsc7u3+7Amfrebo74/dfZ27bwZ+AJyCPj/Z/68eIqw4UkXoZxoDXEnvn5Fu10ksZZm7o6DSN/1Zs6xsRb98biT86jzD3bPbHXZZp83CvjkHA0vcfSuwju7XcSsXJxIGLawxs/XAV4EzzOxFdr4/BxE6XJezh3y2os/BWqDQF50+PzAW2A/4ibu3uvsW4H8JQbe3tQ57WicxfoPdOTVUHsCvCKN0qoDjKNMROr3cg2uBZ4DqvPQJ0f04gzBy5Uq6jt75HqFqPwY4jPAlUVajd4CRhBE72cd/A7+J7k22SeP46PNzG11Hf+0Rny1Cf9PzwN7RZ+FJQpPhHv/5ia7zdcJmhSlgNHAPoZk5O/rry4QfI1+i6+ivLxI6+acQ+p+WoNFfu/+D8EviXqCJMPLizMEuU8zXfwDhV2YLobqdfZwVHX8fsIzQzPEnYGrOayuAX0RfrBuACwf7emK4X5cSjf6Knp8ZfW6aCFthj93TPluEPpWfEtbrWw/8CBihz0/ndc6Krn0rYb+Uu4C9o2NvB16I7s+LwNtzXmfAVUBd9LiKnJFicT+09peIiBSN+lRERKRoFFRERKRoFFRERKRoFFRERKRoFFRERKRoFFRERKRoFFSk5MzsXDNzM9sWLRCYeywVHbt0EMp1afTeqbjfuz/MLGFmV5vZOjPLmNm9PeRdFV1T/mN+nGWWPddu/T+TlJ29gH8nzBqWvvsYYTb1RcDTwJZe8j9EmHyZa3vxiyWyMwUVidPDwD+b2dXuvn6wCxMHM6tw99YBnubw6O/V7p7pQ/7N7v5Mf96gSOUUUfOXxOry6O83esqUbZYqkH6Tma3KeT41atr5opldEW3B2mBmt0V7UhxiZg+ZWWO0h8c53bzl4dEWtjuiJqbLolVjc997vJn9zMxqzaw12vp2Tl6ebDPfCWZ2l5ltA57t5VpPNrOnzazZzOotbDV8aM7xVbxV60hH5z+3p3P2xszmm9mfzOx0M/urmbUSNsrCzL5sZs+YWV3UXPmUmZ2c9/pDonKcF21juyG677eYWaWZTTezh6P7/qqZfaZAGd5uZvdH79Eclem4vDzHmNmjUVl2WNh++McDuXYpPQUVidM64CfAHMvZg7wIvk5YSO8c4FvAJwmLX94DzAM+QtjU6H/NrNDmRfcCjwKnE7b6vSQ6D9C5+dafgQ8RvuA/BNwP/MzM/rnA+W4HVhKarbpt6ou+rOcR1lD7JHA+cCQwP9qkiajsN0X/fmf0mNfdOd86taXyHvl7axxOWHr+auADhDWnIKzxdj1ha99PETZ8etDMTirwPt8kLAb5WcJ9ORP4GWH59vuisr8M3Gxmh+UU7mjC/dwL+DzhPtUDj1m097qZ7QU8SNhi4bOE1Xq/S1g/THZng72Imh7l/wDOJSxGeQhh8cRtwC+iY6no2KU5+S8NH82dznMTsCrn+dTotX/Iy3d3lP6ZnLQxQAfw7fz3Ab6W9/qfE/aqGB09v4SwkOa0Avk2A6m86/xhH+/LAuDV7OujtAOBduAHOWmXF7of3ZxzVVSG/Mf7cvLMBzLA23o5VyL67/MH4P9y0g+JzvlwXv77ovRP5aSNj97rGzlpjwOLgWE5aSnCNgC/iZ4fE53riMH+/OrRv4dqKhIrd68D5gKfzW3mGaAH854vi/4+lPO+W4GNhD0r8t2Z9/xXhN30joyen0xoxlqZ++s/Ov844Ii819/TW4Et7BnyN8Cv3b0jp5wrCb/i393bOXrwIHB03iO/GW6Fuy8qUK6jzWyemW0A0oQA9x6g0H+rvtz3zYTAu190/irgXYR77jn3EuAx4ITo368QBhf83MzOMrN9e71q2S0oqMhg+CFhie7LinS+rXnP23pIH1Hg9Ru6eZ5tgtqb8GXXnve4Kzo+Lu/163ovMmMIS5YXyrueUKPbVXXuviDvkb9T4k7vGzVJPkrYOfBLhKa2o4FHKHzfCt73KIDnp2dfP57wvfMddr6fXyS6l9E53kP4b3Et8IaZLTKz03u5dhlkGv0lsXP3RjO7glBj+X6BLC0AZjbc3dty0vO/vItlImGDpNznALXR3y2EWs6Xu3n9K3nP+7KfxNYo36QCxybR+7DhgSpUxlMIAeXjnjM6L6pdFEv2uv+H0PfUfQHdXwQ+GtVkjiYM8PiNmb3N3ZcWsUxSRKqpyGD5KeFL+/ICx1ZHf7PNT5jZaODYEpXlE3nPP0XoPF8cPf89YcfBNQVqAIVqAb1y9ybCpksfN7NkNj2qLRxL6HeI28job3abaMzscOAdxXoDd98OPEXYDveFQvezwGs63P1pwuCJJOG/heymVFORQeHurWZ2GWGkUb4HCaOBfm5m3ybs/Hcx4Yu+FM6LhhA/TxgJ9XnCwIFt0fEfEkZnPWlmPyTUTKoIX27Hu/tpu/i+lxBGcj1gZj8l9ON8h3Dtc3f1YgbgEUI/ym3RdU6OyrOmyO/zFcJos9+b2S8IzX3jgdmEAQn/YWanAf9IGJm3inBv/pXQz9LjMG0ZXKqpyGD6X8Lopy6iL/NTCaOG7gSuAH4M/LFE5TgNOIkweukzhNrTd3PKU0+oPfyOsCLAQ4TtbU8bSJnc/feE4cmjCdd5LWGv8Xe5+5u7et4BlOcl4GzgIMK9+Crwb4SaRTHf53ng7wjB8yeEYHY1YZjzE1G25UAroXbyIHAjoVn0vYNxb6TvtJ2wiIgUjWoqIiJSNAoqIiJSNAoqIiJSNAoqIiJSNAoqIiJSNAoqIiJSNAoqIiJSNAoqIiJSNAoqIiJSNP8fCDH0CIqn5QsAAAAASUVORK5CYII=\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 |
--------------------------------------------------------------------------------