├── ELA_Training ├── MainELA.ipynb ├── model_ela.h5 └── temp_file_name.jpg ├── README.md ├── WeatherCNNTraining ├── WeatherCNN.ipynb └── Weather_Model.h5 ├── app.py ├── fetchOriginal.py ├── helper.py ├── imgs ├── edited.jpg ├── fake1.jpg ├── org1.jpg ├── org2.jpg ├── step1.jpg ├── step2.jpg └── step3.jpg ├── requirements.txt ├── res ├── fake1.jpg └── org2.jpg └── rsc ├── ela.jpg ├── fake.jpg ├── fake_img.jpg └── real.jpg /ELA_Training/model_ela.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayant1211/Image-Tampering-Detection-using-ELA-and-Metadata-Analysis/ed68e34c5a8424bce8f9747b214ca0dbde6dbd5a/ELA_Training/model_ela.h5 -------------------------------------------------------------------------------- /ELA_Training/temp_file_name.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayant1211/Image-Tampering-Detection-using-ELA-and-Metadata-Analysis/ed68e34c5a8424bce8f9747b214ca0dbde6dbd5a/ELA_Training/temp_file_name.jpg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Image Tampering Detection Using ELA and Metadata Analysis 2 | 3 | Image forensics has witnessed significant growth in recent years, driven by advancements in computer vision and the surge of digital data. Ensuring the authenticity of images has become a top priority, as sophisticated manipulation techniques continue to emerge. We propose a multi-modal approach to gain insight into the image's authenticity. 4 | 5 | ### Try it on Streamlit 6 | You can try the live application here.\ 7 | [Live Demo](https://imagetamperingdetection.streamlit.app/) 8 | #### Step 1 9 | Choose the image 10 |

11 | Step 1 12 |

13 | 14 | #### Step 2 15 | Select if weather metadata is available 16 |

17 | Step 2 18 |

19 | 20 | #### Step 3 21 | Analyze the results 22 |

23 | Step 3 24 |

25 | 26 | 27 | ### Running Locally 28 | Clone the repo
29 | ```bash 30 | git clone https://github.com/jayant1211/Image-Tampering-Detection-using-ELA-and-Metadata-Analysis.git 31 | cd Image-Tampering-Detection-using-ELA-and-Metadata-Analysis/ 32 | ``` 33 | 34 | to install all dependencies, create a new virtualenv, and install all required packages as:
35 | ```bash 36 | pip install -r reuqirements 37 | ``` 38 | 39 | Usage:
40 | Keep the model in ELA_Training Folder
41 | run streamlit run app.py for local inference
42 | 43 | ### A Short Summary 44 | We are using ELA and Metadata Analysis to achieve insight into the authenticity of an image
45 | #### 1. ELA 46 | when a lossy algorithm like JPEG compresses an image, the compression process introduces artifacts or discrepancies in it. these can appear as blocks or regions within an image, exhibiting pixel values that differ from those of the surrounding areas. when an image goes under manipulation, compression artifacts are disrupted for the tampered region.
47 | 48 | in ELA, we calculate the absolute mean of an image at different compression levels: 49 |

50 | ELA Real Image 51 |

52 |

ELA

53 | by doing this, we are essentially amplifying the variations caused by compression artifacts. 54 |

55 | Fake Image 56 |

57 |

ELA for fake image

58 | The CASIA2.0 dataset contains a set of real and tampered images, we have used this dataset, and it is pre-processed to produce the ELA of every image(optimal image quality for compression level for calculating absolute diff was 90%). This preprocessed dataset is then trained on DenseNet121. 59 |
60 |
61 | 62 | #### 2. Weather Validation using Metadata Analysis 63 | image contains a lot of metadata with it, say, camera model, date, time, location, etc. By 'weather validation' to gain insight into the authenticity of an image, we mean precisely validating the depicted weather. A trained Weather CNN detects weather depicted in an image(preferably outdoor), and this result of Weather CNN is validated using Historical weather data. for fetching weather data all you need is a good open-source weather database, place, date, and time. Using metadata analysis, we could extract longitude and latitude, as well as the date and time. then parsing this metadata, we can send a request to weather-API to get the original weather on that place on a given date and time and validate our weather-CNN's result. 64 |
The dataset for training weather-CNN was collected from various sources. We have collected a total of 1,804 training images and 451 validation images, and the categories we narrowed down for the classification are the following: 65 | 71 | 72 | ### Training 73 | In case you want to retrain the ELA models, download the CASIA2.0 Dataset and put it inside ELA_Training and run main.ipynb. If you want to access the weather dataset, you can contact me. 74 | 75 | ### Results 76 | For ELA with DenseNet, using standard practices for training and optimizing the model, the accuracies model achieved were: 77 | | Metric | Accuracy | 78 | |-----------------------|----------:| 79 | | Train Accuracy | 98.34% | 80 | | Validation Accuracy | 93.78% | 81 | | Test Accuracy | 87.24% | 82 | 83 | For Weather CNN:
84 | | Metric | Accuracy | 85 | |-----------------------|----------:| 86 | | Train Accuracy | 91.2% | 87 | | Validation Accuracy | 81.6% | 88 | | Test Accuracy | 73.4% | 89 | 90 | ### Video 91 | [Video Result](https://youtu.be/aEpDw_GZb9g) 92 | 93 | ### To-Dos 94 | - [ ] Use scene classification model to remove user dependency for checking whether the image is outdoor or not. (In progress) 95 | - [ ] Integration of Web-Traces and more modalities to Improve upon the Results. 96 | 97 | ## Cite 98 | If you use our study in your research, please consider citing us, Thanks: 99 | 100 |

BibTeX Citation

101 | 102 |

103 | @INPROCEEDINGS{10169948,
104 |   author={Madake, Jyoti and Meshram, Jayant and Mondhe, Ajinkya and Mashalkar, Pruthviraj},
105 |   booktitle={2023 4th International Conference for Emerging Technology (INCET)}, 
106 |   title={Image Tampering Detection Using Error Level Analysis and Metadata Analysis}, 
107 |   year={2023},
108 |   volume={},
109 |   number={},
110 |   pages={1-7},
111 |   doi={10.1109/INCET57972.2023.10169948}}
112 | 
113 |   
114 | -------------------------------------------------------------------------------- /WeatherCNNTraining/WeatherCNN.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import os\n", 10 | "from PIL import Image\n", 11 | "import cv2\n", 12 | "import numpy as np" 13 | ] 14 | }, 15 | { 16 | "cell_type": "code", 17 | "execution_count": 2, 18 | "metadata": {}, 19 | "outputs": [ 20 | { 21 | "name": "stdout", 22 | "output_type": "stream", 23 | "text": [ 24 | "Adding images in lightning\n", 25 | "\t 377 images\n", 26 | "Adding images in rain\n", 27 | "\t 526 images\n", 28 | "Adding images in snow\n", 29 | "\t 620 images\n", 30 | "Adding images in sunny\n", 31 | "\t 732 images\n" 32 | ] 33 | } 34 | ], 35 | "source": [ 36 | "images = []\n", 37 | "labels = []\n", 38 | "\n", 39 | "label = 0\n", 40 | "for classes in os.listdir('Data/'):\n", 41 | " class_folder = os.path.join('Data',classes)\n", 42 | " print('Adding images in ',classes)\n", 43 | " #print(class_folder)\n", 44 | " img_ct = 0\n", 45 | " for image_name in os.listdir(class_folder):\n", 46 | " img_name = os.path.join(class_folder,image_name)\n", 47 | " img = cv2.imread(img_name)\n", 48 | " #resize\n", 49 | " img = cv2.resize(img,(128,128))\n", 50 | " #normalize\n", 51 | " img = img/255.0\n", 52 | " images.append(img)\n", 53 | " labels.append(label)\n", 54 | " img_ct+=1\n", 55 | " print('\\t',img_ct,' images')\n", 56 | " label=label+1" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": 3, 62 | "metadata": {}, 63 | "outputs": [], 64 | "source": [ 65 | "from keras.utils.np_utils import to_categorical\n", 66 | "\n", 67 | "X = np.array(images)\n", 68 | "Y = to_categorical(labels, 4)\n", 69 | "X = X.reshape(-1, 128, 128, 3)" 70 | ] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "execution_count": 4, 75 | "metadata": {}, 76 | "outputs": [ 77 | { 78 | "data": { 79 | "text/plain": [ 80 | "array([[1., 0., 0., 0.],\n", 81 | " [1., 0., 0., 0.],\n", 82 | " [1., 0., 0., 0.],\n", 83 | " ...,\n", 84 | " [0., 0., 0., 1.],\n", 85 | " [0., 0., 0., 1.],\n", 86 | " [0., 0., 0., 1.]], dtype=float32)" 87 | ] 88 | }, 89 | "execution_count": 4, 90 | "metadata": {}, 91 | "output_type": "execute_result" 92 | } 93 | ], 94 | "source": [ 95 | "Y" 96 | ] 97 | }, 98 | { 99 | "cell_type": "code", 100 | "execution_count": 5, 101 | "metadata": {}, 102 | "outputs": [], 103 | "source": [ 104 | "import numpy as np\n", 105 | "from sklearn.model_selection import train_test_split\n", 106 | "\n", 107 | "X_train, X_val, y_train, y_val = train_test_split(\n", 108 | " X, Y, test_size=.2, random_state=0, stratify=Y\n", 109 | ")" 110 | ] 111 | }, 112 | { 113 | "cell_type": "code", 114 | "execution_count": 6, 115 | "metadata": {}, 116 | "outputs": [ 117 | { 118 | "name": "stdout", 119 | "output_type": "stream", 120 | "text": [ 121 | "1804\n" 122 | ] 123 | } 124 | ], 125 | "source": [ 126 | "print(len(y_train))" 127 | ] 128 | }, 129 | { 130 | "cell_type": "code", 131 | "execution_count": 7, 132 | "metadata": {}, 133 | "outputs": [ 134 | { 135 | "data": { 136 | "text/plain": [ 137 | "array([[0., 1., 0., 0.],\n", 138 | " [0., 0., 1., 0.],\n", 139 | " [0., 1., 0., 0.],\n", 140 | " ...,\n", 141 | " [0., 0., 1., 0.],\n", 142 | " [1., 0., 0., 0.],\n", 143 | " [0., 0., 1., 0.]], dtype=float32)" 144 | ] 145 | }, 146 | "execution_count": 7, 147 | "metadata": {}, 148 | "output_type": "execute_result" 149 | } 150 | ], 151 | "source": [ 152 | "y_train" 153 | ] 154 | }, 155 | { 156 | "cell_type": "code", 157 | "execution_count": 8, 158 | "metadata": {}, 159 | "outputs": [ 160 | { 161 | "data": { 162 | "text/plain": [ 163 | "array([[[[0.78039216, 0.82745098, 0.78431373],\n", 164 | " [0.80392157, 0.78823529, 0.77647059],\n", 165 | " [0.80392157, 0.77647059, 0.78039216],\n", 166 | " ...,\n", 167 | " [0.06666667, 0.20784314, 0.18431373],\n", 168 | " [0.08235294, 0.22352941, 0.2 ],\n", 169 | " [0.08235294, 0.22352941, 0.20392157]],\n", 170 | "\n", 171 | " [[0.68627451, 0.74509804, 0.70196078],\n", 172 | " [0.83529412, 0.81960784, 0.80784314],\n", 173 | " [0.84313725, 0.81176471, 0.81568627],\n", 174 | " ...,\n", 175 | " [0.08235294, 0.22352941, 0.2 ],\n", 176 | " [0.10980392, 0.25098039, 0.22745098],\n", 177 | " [0.08627451, 0.22745098, 0.20392157]],\n", 178 | "\n", 179 | " [[0.39215686, 0.4745098 , 0.42745098],\n", 180 | " [0.85490196, 0.85098039, 0.83529412],\n", 181 | " [0.82352941, 0.78823529, 0.79607843],\n", 182 | " ...,\n", 183 | " [0.15294118, 0.29411765, 0.27058824],\n", 184 | " [0.10588235, 0.24705882, 0.22352941],\n", 185 | " [0.08235294, 0.22352941, 0.2 ]],\n", 186 | "\n", 187 | " ...,\n", 188 | "\n", 189 | " [[0.69019608, 0.70980392, 0.67843137],\n", 190 | " [0.64705882, 0.6627451 , 0.63137255],\n", 191 | " [0.62352941, 0.64313725, 0.60784314],\n", 192 | " ...,\n", 193 | " [0.31764706, 0.39215686, 0.38039216],\n", 194 | " [0.07843137, 0.15294118, 0.14117647],\n", 195 | " [0.17647059, 0.24705882, 0.25098039]],\n", 196 | "\n", 197 | " [[0.59607843, 0.6 , 0.59607843],\n", 198 | " [0.56862745, 0.56470588, 0.55686275],\n", 199 | " [0.70196078, 0.69019608, 0.67058824],\n", 200 | " ...,\n", 201 | " [0.14117647, 0.21568627, 0.20784314],\n", 202 | " [0.12941176, 0.21960784, 0.20392157],\n", 203 | " [0.11764706, 0.19607843, 0.2 ]],\n", 204 | "\n", 205 | " [[0.62745098, 0.63137255, 0.63137255],\n", 206 | " [0.66666667, 0.65882353, 0.65490196],\n", 207 | " [0.51764706, 0.50196078, 0.48235294],\n", 208 | " ...,\n", 209 | " [0.21176471, 0.28627451, 0.2745098 ],\n", 210 | " [0.12156863, 0.21568627, 0.2 ],\n", 211 | " [0.09803922, 0.17647059, 0.18039216]]],\n", 212 | "\n", 213 | "\n", 214 | " [[[0.56470588, 0.45098039, 0.31764706],\n", 215 | " [0.53333333, 0.44705882, 0.31764706],\n", 216 | " [0.45098039, 0.43137255, 0.38823529],\n", 217 | " ...,\n", 218 | " [0.54117647, 0.45490196, 0.28627451],\n", 219 | " [0.56078431, 0.43529412, 0.2627451 ],\n", 220 | " [0.50980392, 0.37647059, 0.18823529]],\n", 221 | "\n", 222 | " [[0.4627451 , 0.39215686, 0.32941176],\n", 223 | " [0.38823529, 0.34509804, 0.2627451 ],\n", 224 | " [0.25490196, 0.22745098, 0.19215686],\n", 225 | " ...,\n", 226 | " [0.46666667, 0.43137255, 0.40392157],\n", 227 | " [0.32156863, 0.31372549, 0.27843137],\n", 228 | " [0.3254902 , 0.3254902 , 0.27843137]],\n", 229 | "\n", 230 | " [[0.23921569, 0.19215686, 0.17647059],\n", 231 | " [0.21960784, 0.18823529, 0.14509804],\n", 232 | " [0.20784314, 0.15686275, 0.11372549],\n", 233 | " ...,\n", 234 | " [0.40392157, 0.29803922, 0.17647059],\n", 235 | " [0.39215686, 0.30588235, 0.19607843],\n", 236 | " [0.35686275, 0.2745098 , 0.2 ]],\n", 237 | "\n", 238 | " ...,\n", 239 | "\n", 240 | " [[0.77254902, 0.79215686, 0.78431373],\n", 241 | " [0.78431373, 0.81176471, 0.8 ],\n", 242 | " [0.74117647, 0.77647059, 0.76862745],\n", 243 | " ...,\n", 244 | " [0.82352941, 0.83137255, 0.83529412],\n", 245 | " [0.81568627, 0.83921569, 0.83921569],\n", 246 | " [0.83921569, 0.85882353, 0.85882353]],\n", 247 | "\n", 248 | " [[0.81960784, 0.83529412, 0.82745098],\n", 249 | " [0.77647059, 0.79215686, 0.79215686],\n", 250 | " [0.36862745, 0.35686275, 0.3372549 ],\n", 251 | " ...,\n", 252 | " [0.78039216, 0.79215686, 0.79607843],\n", 253 | " [0.79607843, 0.81960784, 0.82352941],\n", 254 | " [0.80784314, 0.83921569, 0.83529412]],\n", 255 | "\n", 256 | " [[0.77647059, 0.78823529, 0.78039216],\n", 257 | " [0.3254902 , 0.30196078, 0.2745098 ],\n", 258 | " [0.5372549 , 0.50588235, 0.47843137],\n", 259 | " ...,\n", 260 | " [0.78823529, 0.81176471, 0.81960784],\n", 261 | " [0.81960784, 0.83921569, 0.84705882],\n", 262 | " [0.82745098, 0.85490196, 0.85490196]]],\n", 263 | "\n", 264 | "\n", 265 | " [[[0.1254902 , 0.10588235, 0.09803922],\n", 266 | " [0.23529412, 0.21176471, 0.19215686],\n", 267 | " [0.31372549, 0.31372549, 0.30980392],\n", 268 | " ...,\n", 269 | " [0.45098039, 0.46666667, 0.52156863],\n", 270 | " [0.36078431, 0.37647059, 0.41568627],\n", 271 | " [0.45490196, 0.4627451 , 0.49803922]],\n", 272 | "\n", 273 | " [[0.07843137, 0.07058824, 0.07058824],\n", 274 | " [0.21176471, 0.18823529, 0.17254902],\n", 275 | " [0.28235294, 0.28235294, 0.27843137],\n", 276 | " ...,\n", 277 | " [0.27843137, 0.29411765, 0.34509804],\n", 278 | " [0.50196078, 0.50980392, 0.55294118],\n", 279 | " [0.4745098 , 0.48235294, 0.51764706]],\n", 280 | "\n", 281 | " [[0.10196078, 0.09411765, 0.09019608],\n", 282 | " [0.19607843, 0.17647059, 0.16470588],\n", 283 | " [0.30980392, 0.30980392, 0.30588235],\n", 284 | " ...,\n", 285 | " [0.30980392, 0.32156863, 0.36078431],\n", 286 | " [0.49411765, 0.50980392, 0.56470588],\n", 287 | " [0.52156863, 0.51764706, 0.55294118]],\n", 288 | "\n", 289 | " ...,\n", 290 | "\n", 291 | " [[0.08627451, 0.10588235, 0.12941176],\n", 292 | " [0.43529412, 0.45490196, 0.46666667],\n", 293 | " [0.52941176, 0.54901961, 0.55686275],\n", 294 | " ...,\n", 295 | " [0.87058824, 0.82352941, 0.80392157],\n", 296 | " [0.8627451 , 0.81568627, 0.8 ],\n", 297 | " [0.8627451 , 0.81568627, 0.79215686]],\n", 298 | "\n", 299 | " [[0.08235294, 0.10980392, 0.12156863],\n", 300 | " [0.1254902 , 0.14117647, 0.16078431],\n", 301 | " [0.29803922, 0.3254902 , 0.3372549 ],\n", 302 | " ...,\n", 303 | " [0.74117647, 0.69411765, 0.67843137],\n", 304 | " [0.7372549 , 0.69019608, 0.6745098 ],\n", 305 | " [0.76862745, 0.71372549, 0.70196078]],\n", 306 | "\n", 307 | " [[0.08235294, 0.10588235, 0.1254902 ],\n", 308 | " [0.09019608, 0.10196078, 0.13333333],\n", 309 | " [0.06666667, 0.09019608, 0.10980392],\n", 310 | " ...,\n", 311 | " [0.78823529, 0.7372549 , 0.72941176],\n", 312 | " [0.71764706, 0.67058824, 0.6627451 ],\n", 313 | " [0.6745098 , 0.63137255, 0.61960784]]],\n", 314 | "\n", 315 | "\n", 316 | " ...,\n", 317 | "\n", 318 | "\n", 319 | " [[[0.72941176, 0.69411765, 0.68627451],\n", 320 | " [0.73333333, 0.69803922, 0.68627451],\n", 321 | " [0.7372549 , 0.70196078, 0.69019608],\n", 322 | " ...,\n", 323 | " [0.16078431, 0.13333333, 0.12156863],\n", 324 | " [0.23137255, 0.21176471, 0.2 ],\n", 325 | " [0.2745098 , 0.2627451 , 0.24705882]],\n", 326 | "\n", 327 | " [[0.73333333, 0.69803922, 0.68627451],\n", 328 | " [0.73333333, 0.69803922, 0.69019608],\n", 329 | " [0.7372549 , 0.70196078, 0.69019608],\n", 330 | " ...,\n", 331 | " [0.21568627, 0.18823529, 0.17647059],\n", 332 | " [0.16862745, 0.14901961, 0.1372549 ],\n", 333 | " [0.3254902 , 0.31372549, 0.29803922]],\n", 334 | "\n", 335 | " [[0.7372549 , 0.69803922, 0.69019608],\n", 336 | " [0.7372549 , 0.70196078, 0.69019608],\n", 337 | " [0.74117647, 0.70588235, 0.69411765],\n", 338 | " ...,\n", 339 | " [0.22352941, 0.19607843, 0.18431373],\n", 340 | " [0.25882353, 0.23529412, 0.22352941],\n", 341 | " [0.42745098, 0.41176471, 0.4 ]],\n", 342 | "\n", 343 | " ...,\n", 344 | "\n", 345 | " [[0.25098039, 0.22745098, 0.23137255],\n", 346 | " [0.25098039, 0.22745098, 0.23137255],\n", 347 | " [0.25490196, 0.23137255, 0.23529412],\n", 348 | " ...,\n", 349 | " [0.20392157, 0.2 , 0.21568627],\n", 350 | " [0.15294118, 0.14901961, 0.16078431],\n", 351 | " [0.15294118, 0.14901961, 0.16078431]],\n", 352 | "\n", 353 | " [[0.30980392, 0.29411765, 0.30196078],\n", 354 | " [0.24313725, 0.22745098, 0.23529412],\n", 355 | " [0.2745098 , 0.25882353, 0.26666667],\n", 356 | " ...,\n", 357 | " [0.2 , 0.19607843, 0.20392157],\n", 358 | " [0.2 , 0.19607843, 0.20784314],\n", 359 | " [0.18823529, 0.18431373, 0.2 ]],\n", 360 | "\n", 361 | " [[0.24705882, 0.25490196, 0.2745098 ],\n", 362 | " [0.2627451 , 0.2627451 , 0.28235294],\n", 363 | " [0.27058824, 0.2745098 , 0.28627451],\n", 364 | " ...,\n", 365 | " [0.08627451, 0.08627451, 0.08627451],\n", 366 | " [0.19215686, 0.18823529, 0.19215686],\n", 367 | " [0.18823529, 0.18431373, 0.19215686]]],\n", 368 | "\n", 369 | "\n", 370 | " [[[0.53333333, 0.03529412, 0.03921569],\n", 371 | " [0.53333333, 0.03137255, 0.03529412],\n", 372 | " [0.53333333, 0.03529412, 0.03921569],\n", 373 | " ...,\n", 374 | " [0.50196078, 0.04313725, 0.03921569],\n", 375 | " [0.50588235, 0.03529412, 0.03529412],\n", 376 | " [0.47843137, 0.03921569, 0.03137255]],\n", 377 | "\n", 378 | " [[0.5372549 , 0.03529412, 0.04313725],\n", 379 | " [0.54117647, 0.03529412, 0.03921569],\n", 380 | " [0.54509804, 0.03529412, 0.04313725],\n", 381 | " ...,\n", 382 | " [0.50980392, 0.04313725, 0.03921569],\n", 383 | " [0.51764706, 0.03921569, 0.03921569],\n", 384 | " [0.49019608, 0.03921569, 0.03529412]],\n", 385 | "\n", 386 | " [[0.54117647, 0.03921569, 0.04313725],\n", 387 | " [0.54901961, 0.03137255, 0.03921569],\n", 388 | " [0.56470588, 0.03921569, 0.04705882],\n", 389 | " ...,\n", 390 | " [0.5254902 , 0.04313725, 0.04313725],\n", 391 | " [0.5372549 , 0.03529412, 0.03921569],\n", 392 | " [0.50980392, 0.03921569, 0.03921569]],\n", 393 | "\n", 394 | " ...,\n", 395 | "\n", 396 | " [[0.12156863, 0.04705882, 0.01960784],\n", 397 | " [0.11372549, 0.04313725, 0.02352941],\n", 398 | " [0.30980392, 0.25882353, 0.23921569],\n", 399 | " ...,\n", 400 | " [0.1254902 , 0.04705882, 0.02745098],\n", 401 | " [0.1254902 , 0.04705882, 0.02745098],\n", 402 | " [0.1254902 , 0.04705882, 0.02745098]],\n", 403 | "\n", 404 | " [[0.12156863, 0.04313725, 0.01568627],\n", 405 | " [0.10196078, 0.03137255, 0.00784314],\n", 406 | " [0.12941176, 0.05882353, 0.02745098],\n", 407 | " ...,\n", 408 | " [0.1254902 , 0.04705882, 0.02745098],\n", 409 | " [0.1254902 , 0.04705882, 0.02745098],\n", 410 | " [0.1254902 , 0.04705882, 0.02745098]],\n", 411 | "\n", 412 | " [[0.1254902 , 0.05098039, 0.02352941],\n", 413 | " [0.1254902 , 0.05098039, 0.02352941],\n", 414 | " [0.1254902 , 0.05098039, 0.02745098],\n", 415 | " ...,\n", 416 | " [0.10588235, 0.04705882, 0.02745098],\n", 417 | " [0.1254902 , 0.04705882, 0.02745098],\n", 418 | " [0.10980392, 0.04705882, 0.02352941]]],\n", 419 | "\n", 420 | "\n", 421 | " [[[0.48627451, 0.58039216, 0.62745098],\n", 422 | " [0.34509804, 0.40392157, 0.45098039],\n", 423 | " [0.44705882, 0.48235294, 0.5254902 ],\n", 424 | " ...,\n", 425 | " [0.49411765, 0.54509804, 0.59215686],\n", 426 | " [0.45882353, 0.50980392, 0.55686275],\n", 427 | " [0.49803922, 0.54901961, 0.6 ]],\n", 428 | "\n", 429 | " [[0.56862745, 0.66666667, 0.7254902 ],\n", 430 | " [0.4627451 , 0.5254902 , 0.57647059],\n", 431 | " [0.32156863, 0.36470588, 0.40392157],\n", 432 | " ...,\n", 433 | " [0.46666667, 0.5372549 , 0.59607843],\n", 434 | " [0.43529412, 0.50588235, 0.56078431],\n", 435 | " [0.48235294, 0.55294118, 0.61176471]],\n", 436 | "\n", 437 | " [[0.45882353, 0.55686275, 0.63529412],\n", 438 | " [0.53333333, 0.60784314, 0.6627451 ],\n", 439 | " [0.35686275, 0.41568627, 0.45098039],\n", 440 | " ...,\n", 441 | " [0.4627451 , 0.54509804, 0.60392157],\n", 442 | " [0.49411765, 0.58431373, 0.64313725],\n", 443 | " [0.41176471, 0.49411765, 0.55686275]],\n", 444 | "\n", 445 | " ...,\n", 446 | "\n", 447 | " [[0.39607843, 0.39607843, 0.34901961],\n", 448 | " [0.45098039, 0.44313725, 0.4 ],\n", 449 | " [0.43529412, 0.42352941, 0.38039216],\n", 450 | " ...,\n", 451 | " [0.25882353, 0.24313725, 0.21960784],\n", 452 | " [0.23921569, 0.22352941, 0.20392157],\n", 453 | " [0.2 , 0.19215686, 0.16078431]],\n", 454 | "\n", 455 | " [[0.39607843, 0.39607843, 0.34901961],\n", 456 | " [0.45882353, 0.45098039, 0.40784314],\n", 457 | " [0.4627451 , 0.45098039, 0.40784314],\n", 458 | " ...,\n", 459 | " [0.47058824, 0.45490196, 0.43137255],\n", 460 | " [0.50196078, 0.48627451, 0.46666667],\n", 461 | " [0.43137255, 0.42352941, 0.39215686]],\n", 462 | "\n", 463 | " [[0.36078431, 0.36078431, 0.31372549],\n", 464 | " [0.39215686, 0.38431373, 0.34117647],\n", 465 | " [0.41568627, 0.40784314, 0.36470588],\n", 466 | " ...,\n", 467 | " [0.39215686, 0.37647059, 0.35294118],\n", 468 | " [0.31372549, 0.29803922, 0.27843137],\n", 469 | " [0.23137255, 0.22352941, 0.19215686]]]])" 470 | ] 471 | }, 472 | "execution_count": 8, 473 | "metadata": {}, 474 | "output_type": "execute_result" 475 | } 476 | ], 477 | "source": [ 478 | "X_train" 479 | ] 480 | }, 481 | { 482 | "cell_type": "code", 483 | "execution_count": 9, 484 | "metadata": {}, 485 | "outputs": [ 486 | { 487 | "data": { 488 | "text/plain": [ 489 | "(451, 128, 128, 3)" 490 | ] 491 | }, 492 | "execution_count": 9, 493 | "metadata": {}, 494 | "output_type": "execute_result" 495 | } 496 | ], 497 | "source": [ 498 | "X_val.shape" 499 | ] 500 | }, 501 | { 502 | "cell_type": "code", 503 | "execution_count": 10, 504 | "metadata": {}, 505 | "outputs": [], 506 | "source": [ 507 | "num_classes = 4" 508 | ] 509 | }, 510 | { 511 | "cell_type": "code", 512 | "execution_count": 11, 513 | "metadata": {}, 514 | "outputs": [], 515 | "source": [ 516 | "from keras.models import Sequential\n", 517 | "from keras.layers import Conv2D, MaxPooling2D, Flatten, Dropout, Dense\n", 518 | "\n", 519 | "model = Sequential()\n", 520 | "model.add(Conv2D(32, kernel_size=(1,1),input_shape=(128, 128, 3), activation='relu'))\n", 521 | "model.add(MaxPooling2D(pool_size=(2, 2)))\n", 522 | "model.add(Conv2D(32, kernel_size=(5,5), activation='relu'))\n", 523 | "model.add(MaxPooling2D(pool_size=(2, 2)))\n", 524 | "model.add(Flatten())\n", 525 | "model.add(Dense(100, activation = 'relu'))\n", 526 | "model.add(Dense(100, activation = 'relu'))\n", 527 | "model.add(Dropout(0.5))\n", 528 | "model.add(Dense(50, activation = 'relu'))\n", 529 | "model.add(Dense(num_classes, activation='softmax'))" 530 | ] 531 | }, 532 | { 533 | "cell_type": "code", 534 | "execution_count": 12, 535 | "metadata": {}, 536 | "outputs": [], 537 | "source": [ 538 | "def scheduler(epoch):\n", 539 | " lr = 0.0001\n", 540 | " if epoch < 10:\n", 541 | " return lr\n", 542 | " else:\n", 543 | " return lr * (0.9)" 544 | ] 545 | }, 546 | { 547 | "cell_type": "code", 548 | "execution_count": 13, 549 | "metadata": {}, 550 | "outputs": [], 551 | "source": [ 552 | "from tensorflow.keras.optimizers import Adam\n", 553 | "from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint, LearningRateScheduler, TensorBoard\n", 554 | "\n", 555 | "opt = Adam(learning_rate=1e-5)\n", 556 | "\n", 557 | "learning_rs = LearningRateScheduler(scheduler)\n", 558 | "callbacks_all = [learning_rs]\n", 559 | "\n", 560 | "model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])" 561 | ] 562 | }, 563 | { 564 | "cell_type": "code", 565 | "execution_count": 14, 566 | "metadata": {}, 567 | "outputs": [ 568 | { 569 | "name": "stdout", 570 | "output_type": "stream", 571 | "text": [ 572 | "Model: \"sequential\"\n", 573 | "_________________________________________________________________\n", 574 | " Layer (type) Output Shape Param # \n", 575 | "=================================================================\n", 576 | " conv2d (Conv2D) (None, 128, 128, 32) 128 \n", 577 | " \n", 578 | " max_pooling2d (MaxPooling2D (None, 64, 64, 32) 0 \n", 579 | " ) \n", 580 | " \n", 581 | " conv2d_1 (Conv2D) (None, 60, 60, 32) 25632 \n", 582 | " \n", 583 | " max_pooling2d_1 (MaxPooling (None, 30, 30, 32) 0 \n", 584 | " 2D) \n", 585 | " \n", 586 | " flatten (Flatten) (None, 28800) 0 \n", 587 | " \n", 588 | " dense (Dense) (None, 100) 2880100 \n", 589 | " \n", 590 | " dense_1 (Dense) (None, 100) 10100 \n", 591 | " \n", 592 | " dropout (Dropout) (None, 100) 0 \n", 593 | " \n", 594 | " dense_2 (Dense) (None, 50) 5050 \n", 595 | " \n", 596 | " dense_3 (Dense) (None, 4) 204 \n", 597 | " \n", 598 | "=================================================================\n", 599 | "Total params: 2,921,214\n", 600 | "Trainable params: 2,921,214\n", 601 | "Non-trainable params: 0\n", 602 | "_________________________________________________________________\n" 603 | ] 604 | } 605 | ], 606 | "source": [ 607 | "model.summary()" 608 | ] 609 | }, 610 | { 611 | "cell_type": "code", 612 | "execution_count": 15, 613 | "metadata": {}, 614 | "outputs": [ 615 | { 616 | "name": "stdout", 617 | "output_type": "stream", 618 | "text": [ 619 | "Epoch 1/20\n", 620 | "57/57 - 29s - loss: 1.2776 - accuracy: 0.3930 - val_loss: 1.0562 - val_accuracy: 0.6142 - lr: 1.0000e-04 - 29s/epoch - 504ms/step\n", 621 | "Epoch 2/20\n", 622 | "57/57 - 19s - loss: 0.9660 - accuracy: 0.5715 - val_loss: 0.7806 - val_accuracy: 0.6608 - lr: 1.0000e-04 - 19s/epoch - 335ms/step\n", 623 | "Epoch 3/20\n", 624 | "57/57 - 19s - loss: 0.8090 - accuracy: 0.6879 - val_loss: 0.7699 - val_accuracy: 0.7073 - lr: 1.0000e-04 - 19s/epoch - 330ms/step\n", 625 | "Epoch 4/20\n", 626 | "57/57 - 19s - loss: 0.7180 - accuracy: 0.7312 - val_loss: 0.6406 - val_accuracy: 0.7627 - lr: 1.0000e-04 - 19s/epoch - 336ms/step\n", 627 | "Epoch 5/20\n", 628 | "57/57 - 19s - loss: 0.6528 - accuracy: 0.7616 - val_loss: 0.6445 - val_accuracy: 0.7738 - lr: 1.0000e-04 - 19s/epoch - 337ms/step\n", 629 | "Epoch 6/20\n", 630 | "57/57 - 18s - loss: 0.5810 - accuracy: 0.7921 - val_loss: 0.5961 - val_accuracy: 0.8004 - lr: 1.0000e-04 - 18s/epoch - 318ms/step\n", 631 | "Epoch 7/20\n", 632 | "57/57 - 18s - loss: 0.5356 - accuracy: 0.8054 - val_loss: 0.5890 - val_accuracy: 0.7938 - lr: 1.0000e-04 - 18s/epoch - 323ms/step\n", 633 | "Epoch 8/20\n", 634 | "57/57 - 19s - loss: 0.4825 - accuracy: 0.8215 - val_loss: 0.5690 - val_accuracy: 0.7805 - lr: 1.0000e-04 - 19s/epoch - 334ms/step\n", 635 | "Epoch 9/20\n", 636 | "57/57 - 19s - loss: 0.4781 - accuracy: 0.8381 - val_loss: 0.5440 - val_accuracy: 0.8137 - lr: 1.0000e-04 - 19s/epoch - 330ms/step\n", 637 | "Epoch 10/20\n", 638 | "57/57 - 18s - loss: 0.4447 - accuracy: 0.8581 - val_loss: 0.5441 - val_accuracy: 0.8160 - lr: 1.0000e-04 - 18s/epoch - 313ms/step\n", 639 | "Epoch 11/20\n", 640 | "57/57 - 20s - loss: 0.4178 - accuracy: 0.8570 - val_loss: 0.5219 - val_accuracy: 0.8071 - lr: 9.0000e-05 - 20s/epoch - 346ms/step\n", 641 | "Epoch 12/20\n", 642 | "57/57 - 20s - loss: 0.3940 - accuracy: 0.8614 - val_loss: 0.5171 - val_accuracy: 0.8226 - lr: 9.0000e-05 - 20s/epoch - 345ms/step\n", 643 | "Epoch 13/20\n", 644 | "57/57 - 17s - loss: 0.3937 - accuracy: 0.8625 - val_loss: 0.5380 - val_accuracy: 0.8204 - lr: 9.0000e-05 - 17s/epoch - 305ms/step\n", 645 | "Epoch 14/20\n", 646 | "57/57 - 18s - loss: 0.3595 - accuracy: 0.8792 - val_loss: 0.5658 - val_accuracy: 0.8160 - lr: 9.0000e-05 - 18s/epoch - 309ms/step\n", 647 | "Epoch 15/20\n", 648 | "57/57 - 18s - loss: 0.3468 - accuracy: 0.8864 - val_loss: 0.4754 - val_accuracy: 0.8448 - lr: 9.0000e-05 - 18s/epoch - 319ms/step\n", 649 | "Epoch 16/20\n", 650 | "57/57 - 17s - loss: 0.3136 - accuracy: 0.8914 - val_loss: 0.5246 - val_accuracy: 0.8093 - lr: 9.0000e-05 - 17s/epoch - 307ms/step\n", 651 | "Epoch 17/20\n", 652 | "57/57 - 17s - loss: 0.3207 - accuracy: 0.8897 - val_loss: 0.4871 - val_accuracy: 0.8271 - lr: 9.0000e-05 - 17s/epoch - 303ms/step\n", 653 | "Epoch 18/20\n", 654 | "57/57 - 18s - loss: 0.2939 - accuracy: 0.9035 - val_loss: 0.4848 - val_accuracy: 0.8248 - lr: 9.0000e-05 - 18s/epoch - 316ms/step\n", 655 | "Epoch 19/20\n", 656 | "57/57 - 17s - loss: 0.2947 - accuracy: 0.8997 - val_loss: 0.5250 - val_accuracy: 0.8160 - lr: 9.0000e-05 - 17s/epoch - 300ms/step\n", 657 | "Epoch 20/20\n", 658 | "57/57 - 17s - loss: 0.2651 - accuracy: 0.9091 - val_loss: 0.5039 - val_accuracy: 0.8226 - lr: 9.0000e-05 - 17s/epoch - 299ms/step\n" 659 | ] 660 | } 661 | ], 662 | "source": [ 663 | "history = model.fit(X_train, y_train, validation_data=(X_val,y_val), epochs=20, verbose=2, batch_size=32,callbacks = callbacks_all)" 664 | ] 665 | }, 666 | { 667 | "cell_type": "code", 668 | "execution_count": 16, 669 | "metadata": {}, 670 | "outputs": [ 671 | { 672 | "data": { 673 | "text/plain": [ 674 | "" 675 | ] 676 | }, 677 | "execution_count": 16, 678 | "metadata": {}, 679 | "output_type": "execute_result" 680 | }, 681 | { 682 | "data": { 683 | "image/png": "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", 684 | "text/plain": [ 685 | "
" 686 | ] 687 | }, 688 | "metadata": {}, 689 | "output_type": "display_data" 690 | } 691 | ], 692 | "source": [ 693 | "import matplotlib.pyplot as plt\n", 694 | "\n", 695 | "plt.plot(history.epoch, history.history['accuracy'], color='blue', label='Train')\n", 696 | "plt.plot(history.epoch, history.history['val_accuracy'],color='green', label='Val')\n", 697 | "plt.xlabel('Epoch')\n", 698 | "plt.xlim([0,30])\n", 699 | "plt.ylabel('Accuracy')\n", 700 | "plt.legend()" 701 | ] 702 | }, 703 | { 704 | "cell_type": "code", 705 | "execution_count": 19, 706 | "metadata": {}, 707 | "outputs": [ 708 | { 709 | "data": { 710 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGwCAYAAABVdURTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABeMUlEQVR4nO3dd3gU5d7G8e+mk5CEnlBClaoISIk0KYYuAqIgcgQEjw2wYAEsFD2ICigqCDbAShFpSicUAVGaIFJCCyEKCT0hIaTtvH/Mm4VICCRsstnN/bmuvbI7O+U3zMnJ7TPPPI/FMAwDERERERfh5ugCREREROxJ4UZERERcisKNiIiIuBSFGxEREXEpCjciIiLiUhRuRERExKUo3IiIiIhL8XB0AfnNarVy4sQJ/P39sVgsji5HREREboJhGFy8eJFy5crh5pZ920yhCzcnTpwgJCTE0WWIiIhILkRHR1OhQoVs1yl04cbf3x8w/3ECAgIcXI2IiIjcjPj4eEJCQmx/x7NT6MJNxq2ogIAAhRsREREnczNdStShWERERFyKwo2IiIi4FIUbERERcSmFrs+NiIi4tvT0dFJTUx1dhuSCl5fXDR/zvhkKNyIi4hIMwyAmJoYLFy44uhTJJTc3N6pUqYKXl9ct7UfhRkREXEJGsClTpgy+vr4aqNXJZAyye/LkSSpWrHhL10/hRkREnF56erot2JQsWdLR5UgulS5dmhMnTpCWloanp2eu96MOxSIi4vQy+tj4+vo6uBK5FRm3o9LT029pPwo3IiLiMnQryrnZ6/op3NjZLYZNERERuUUKN3ayeTOEhkL37o6uREREpHBTuLETf3/YuhXWroXkZEdXIyIihVXlypWZPHmyw/fhSAo3dlK3LgQFwaVLZiuOiIhIdiwWS7avMWPG5Gq/27Zt44knnrBvsU5Gj4LbicUC7dvDN9/AqlXQtq2jKxIRkYLs5MmTtvdz585l1KhRRERE2JYVLVrU9t4wDNLT0/HwuPGf7dKlS9u3UCeklhs7at/e/LlqlWPrEBEp7AwDEhMd8zKMm6sxODjY9goMDMRisdg+HzhwAH9/f5YvX07Dhg3x9vZm06ZNHDlyhG7duhEUFETRokVp3Lgxa9asybTff99SslgsfPHFF/To0QNfX1+qV6/OkiVLcvTvefz4cbp160bRokUJCAigV69exMbG2r7fvXs3bdq0wd/fn4CAABo2bMj27dsBiIqKomvXrhQvXhw/Pz9uv/12li1blqPj55RabuwoLMz8+ccfcOoUlCnj2HpERAqrS5fgqoaPfJWQAH5+9tnXiBEjmDhxIlWrVqV48eJER0fTuXNnxo0bh7e3N19//TVdu3YlIiKCihUrXnc/Y8eO5b333mPChAl8/PHH9O3bl6ioKEqUKHHDGqxWqy3YbNiwgbS0NAYPHkzv3r1Zv349AH379qVBgwZMmzYNd3d3du3aZRuEb/DgwaSkpPDLL7/g5+fHvn37MrVK5QWFGzsKDoZ69WD3blizBh55xNEViYiIM3vzzTdp166d7XOJEiWoV6+e7fNbb73FwoULWbJkCUOGDLnufgYMGECfPn0AePvtt/noo4/YunUrHTt2vGEN4eHh7Nmzh8jISEJCQgD4+uuvuf3229m2bRuNGzfm+PHjvPzyy9SqVQuA6tWr27Y/fvw4PXv2pG7dugBUrVo1B/8CuaPbUnamW1MiIo7n62u2oDjiZc9Bkhs1apTpc0JCAi+99BK1a9emWLFiFC1alP3793P8+PFs93PnnXfa3vv5+REQEMCpU6duqob9+/cTEhJiCzYAderUoVixYuzfvx+AYcOG8fjjjxMWFsY777zDkSNHbOs+++yz/O9//6N58+aMHj2aP//886aOeysUbuzs6nBzs/ddRUTEviwW89aQI172HCTZ71/3t1566SUWLlzI22+/zcaNG9m1axd169YlJSUl2/38e54mi8WC1Wq1W51jxoxh7969dOnShbVr11KnTh0WLlwIwOOPP87Ro0d59NFH2bNnD40aNeLjjz+227GzonBjZy1agI8PnDwJe/c6uhoREXElmzdvZsCAAfTo0YO6desSHBzMsWPH8vSYtWvXJjo6mujoaNuyffv2ceHCBerUqWNbVqNGDV544QVWrVrFAw88wMyZM23fhYSE8NRTT7FgwQJefPFFPv/88zytWeHGznx8oFUr871uTYmIiD1Vr16dBQsWsGvXLnbv3s0jjzxi1xaYrISFhVG3bl369u3Lzp072bp1K/369aNVq1Y0atSIpKQkhgwZwvr164mKimLz5s1s27aN2rVrA/D888+zcuVKIiMj2blzJ+vWrbN9l1cUbvJAhw7mT4UbERGxp/fff5/ixYvTrFkzunbtSocOHbjrrrvy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sVgsdj1WfHw8ISEhREdHu/wtL52r6ypM56tzdV2F6XwLy7kahsHFixcpV67cDdd1aLgpVaoU7u7uxMbGZloeGxtLcHBwltsEBwfnaH1vb2+8vb0zLStWrFjui74JAQEBLv0/sKvpXF1XYTpfnavrKkznWxjO9UYtNhkc+rSUl5cXDRs2JDw83LbMarUSHh5O06ZNs9ymadOmmdYHWL169XXXFxERkcLF4belhg0bRv/+/WnUqBFNmjRh8uTJJCYm8thjjwHQr18/ypcvz/jx4wF47rnnaNWqFZMmTaJLly7MmTOH7du389lnnznyNERERKSAcHi46d27N6dPn2bUqFHExMRQv359VqxYYes0fPz4cdzcrjQwNWvWjO+//57XX3+dV199lerVq7No0SLuuOMOR52Cjbe3N6NHj77mNpgr0rm6rsJ0vjpX11WYzrcwnevNcvg4NyIiIiL25PARikVERETsSeFGREREXIrCjYiIiLgUhRsRERFxKQo3OTR16lQqV66Mj48PoaGhbN26Ndv1f/jhB2rVqoWPjw9169Zl2bJl+VRp7o0fP57GjRvj7+9PmTJl6N69OxEREdluM2vWLCwWS6aXj49PPlV8a8aMGXNN7bVq1cp2G2e8rgCVK1e+5lwtFguDBw/Ocn1nuq6//PILXbt2pVy5clgslmvmmzMMg1GjRlG2bFmKFClCWFgYhw4duuF+c/o7n1+yO9/U1FSGDx9O3bp18fPzo1y5cvTr148TJ05ku8/c/C7khxtd2wEDBlxTd8eOHW+434J4bW90rln9/losFiZMmHDdfRbU65qXFG5yYO7cuQwbNozRo0ezc+dO6tWrR4cOHTh16lSW6//666/06dOHQYMG8ccff9C9e3e6d+/OX3/9lc+V58yGDRsYPHgwv/32G6tXryY1NZX27duTmJiY7XYBAQGcPHnS9oqKisqnim/d7bffnqn2TZs2XXddZ72uANu2bct0nqtXrwbgoYceuu42znJdExMTqVevHlOnTs3y+/fee4+PPvqI6dOn8/vvv+Pn50eHDh24fPnydfeZ09/5/JTd+V66dImdO3fyxhtvsHPnThYsWEBERAT333//Dfebk9+F/HKjawvQsWPHTHXPnj07230W1Gt7o3O9+hxPnjzJjBkzsFgs9OzZM9v9FsTrmqcMuWlNmjQxBg8ebPucnp5u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", 711 | "text/plain": [ 712 | "
" 713 | ] 714 | }, 715 | "metadata": {}, 716 | "output_type": "display_data" 717 | } 718 | ], 719 | "source": [ 720 | "colors = plt.rcParams['axes.prop_cycle'].by_key()['color']\n", 721 | "\n", 722 | "def plot_loss(history, label, n):\n", 723 | " # Use a log scale on y-axis to show the wide range of values.\n", 724 | " plt.plot(history.epoch, history.history['loss'],\n", 725 | " color='blue', label='Train ' + label)\n", 726 | " plt.plot(history.epoch, history.history['val_loss'],color='green', label='Val ' + label,linestyle=\"--\")\n", 727 | " plt.ylim([0, plt.ylim()[1]]) \n", 728 | " plt.xlabel('Epoch')\n", 729 | " plt.ylabel('Loss')\n", 730 | " plt.legend()\n", 731 | "\n", 732 | "plot_loss(history, 'loss', 0)" 733 | ] 734 | }, 735 | { 736 | "cell_type": "code", 737 | "execution_count": 20, 738 | "metadata": {}, 739 | "outputs": [ 740 | { 741 | "name": "stdout", 742 | "output_type": "stream", 743 | "text": [ 744 | "Adding images in 0\n", 745 | "\t 377 images\n", 746 | "Adding images in 1\n", 747 | "\t 214 images\n", 748 | "Adding images in 2\n", 749 | "\t 1000 images\n", 750 | "Adding images in 3\n", 751 | "\t 1000 images\n" 752 | ] 753 | } 754 | ], 755 | "source": [ 756 | "test = []\n", 757 | "labels = []\n", 758 | "\n", 759 | "label = 0\n", 760 | "for classes in os.listdir('Test_Data/'):\n", 761 | " class_folder = os.path.join('Test_Data',classes)\n", 762 | " print('Adding images in ',classes)\n", 763 | " #print(class_folder)\n", 764 | " img_ct = 0\n", 765 | " for image_name in os.listdir(class_folder):\n", 766 | " img_name = os.path.join(class_folder,image_name)\n", 767 | " img = cv2.imread(img_name)\n", 768 | " #resize\n", 769 | " #print(img_name)\n", 770 | " img = cv2.resize(img,(128,128))\n", 771 | " #normalize\n", 772 | " img = img/255.0\n", 773 | " test.append(img)\n", 774 | " labels.append(int(classes))\n", 775 | " img_ct+=1\n", 776 | " print('\\t',img_ct,' images')\n", 777 | " label=label+1" 778 | ] 779 | }, 780 | { 781 | "cell_type": "code", 782 | "execution_count": 21, 783 | "metadata": {}, 784 | "outputs": [], 785 | "source": [ 786 | "X_test = np.array(test)\n", 787 | "Y_test = to_categorical(labels, 4)\n", 788 | "X_test = X_test.reshape(-1, 128, 128, 3)" 789 | ] 790 | }, 791 | { 792 | "cell_type": "code", 793 | "execution_count": 22, 794 | "metadata": {}, 795 | "outputs": [ 796 | { 797 | "data": { 798 | "text/plain": [ 799 | "(2591, 128, 128, 3)" 800 | ] 801 | }, 802 | "execution_count": 22, 803 | "metadata": {}, 804 | "output_type": "execute_result" 805 | } 806 | ], 807 | "source": [ 808 | "X_test.shape" 809 | ] 810 | }, 811 | { 812 | "cell_type": "code", 813 | "execution_count": 23, 814 | "metadata": {}, 815 | "outputs": [ 816 | { 817 | "data": { 818 | "text/plain": [ 819 | "array([[1., 0., 0., 0.],\n", 820 | " [1., 0., 0., 0.],\n", 821 | " [1., 0., 0., 0.],\n", 822 | " ...,\n", 823 | " [0., 0., 0., 1.],\n", 824 | " [0., 0., 0., 1.],\n", 825 | " [0., 0., 0., 1.]], dtype=float32)" 826 | ] 827 | }, 828 | "execution_count": 23, 829 | "metadata": {}, 830 | "output_type": "execute_result" 831 | } 832 | ], 833 | "source": [ 834 | "Y_test" 835 | ] 836 | }, 837 | { 838 | "cell_type": "code", 839 | "execution_count": 24, 840 | "metadata": {}, 841 | "outputs": [ 842 | { 843 | "name": "stdout", 844 | "output_type": "stream", 845 | "text": [ 846 | "81/81 [==============================] - 6s 70ms/step\n" 847 | ] 848 | } 849 | ], 850 | "source": [ 851 | "Y_pred = model.predict(X_test)\n" 852 | ] 853 | }, 854 | { 855 | "cell_type": "code", 856 | "execution_count": 25, 857 | "metadata": {}, 858 | "outputs": [], 859 | "source": [ 860 | "Y_pred_classes = np.argmax(Y_pred,axis = 1) " 861 | ] 862 | }, 863 | { 864 | "cell_type": "code", 865 | "execution_count": 26, 866 | "metadata": {}, 867 | "outputs": [ 868 | { 869 | "data": { 870 | "text/plain": [ 871 | "array([0, 0, 0, ..., 2, 3, 3], dtype=int64)" 872 | ] 873 | }, 874 | "execution_count": 26, 875 | "metadata": {}, 876 | "output_type": "execute_result" 877 | } 878 | ], 879 | "source": [ 880 | "Y_pred_classes" 881 | ] 882 | }, 883 | { 884 | "cell_type": "code", 885 | "execution_count": 27, 886 | "metadata": {}, 887 | "outputs": [], 888 | "source": [ 889 | "# Convert validation observations to one hot vectors\n", 890 | "Y_true = np.argmax(Y_test,axis = 1) " 891 | ] 892 | }, 893 | { 894 | "cell_type": "code", 895 | "execution_count": 28, 896 | "metadata": {}, 897 | "outputs": [ 898 | { 899 | "data": { 900 | "text/plain": [ 901 | "array([0, 0, 0, ..., 3, 3, 3], dtype=int64)" 902 | ] 903 | }, 904 | "execution_count": 28, 905 | "metadata": {}, 906 | "output_type": "execute_result" 907 | } 908 | ], 909 | "source": [ 910 | "Y_true" 911 | ] 912 | }, 913 | { 914 | "cell_type": "code", 915 | "execution_count": 29, 916 | "metadata": {}, 917 | "outputs": [], 918 | "source": [ 919 | "import itertools\n", 920 | "from sklearn.metrics import roc_curve, roc_auc_score\n", 921 | "import matplotlib.pyplot as plt\n", 922 | "\n", 923 | "def plot_confusion_matrix(cm, classes,\n", 924 | " normalize=False,\n", 925 | " title='Confusion matrix',\n", 926 | " cmap=plt.cm.Blues):\n", 927 | " \"\"\"\n", 928 | " This function prints and plots the confusion matrix.\n", 929 | " Normalization can be applied by setting `normalize=True`.\n", 930 | " \"\"\"\n", 931 | " plt.imshow(cm, interpolation='nearest', cmap=cmap)\n", 932 | " plt.title(title)\n", 933 | " plt.colorbar()\n", 934 | " tick_marks = np.arange(len(classes))\n", 935 | " plt.xticks(tick_marks, classes, rotation=45)\n", 936 | " plt.yticks(tick_marks, classes)\n", 937 | "\n", 938 | " if normalize:\n", 939 | " cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n", 940 | "\n", 941 | " thresh = cm.max() / 2.\n", 942 | " for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n", 943 | " plt.text(j, i, cm[i, j],\n", 944 | " horizontalalignment=\"center\",\n", 945 | " color=\"white\" if cm[i, j] > thresh else \"black\")\n", 946 | "\n", 947 | " plt.tight_layout()\n", 948 | " plt.ylabel('True label')\n", 949 | " plt.xlabel('Predicted label')" 950 | ] 951 | }, 952 | { 953 | "cell_type": "code", 954 | "execution_count": 30, 955 | "metadata": {}, 956 | "outputs": [ 957 | { 958 | "data": { 959 | "image/png": "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", 960 | "text/plain": [ 961 | "
" 962 | ] 963 | }, 964 | "metadata": {}, 965 | "output_type": "display_data" 966 | } 967 | ], 968 | "source": [ 969 | "from sklearn.metrics import confusion_matrix\n", 970 | "\n", 971 | "confusion_mtx = confusion_matrix(Y_true, Y_pred_classes) \n", 972 | "plot_confusion_matrix(confusion_mtx, classes = ['Lightning','Rain','Cloudy','Sunny'])" 973 | ] 974 | }, 975 | { 976 | "cell_type": "code", 977 | "execution_count": 31, 978 | "metadata": {}, 979 | "outputs": [], 980 | "source": [ 981 | "test_acc = (364+100+596+842)*100/len(X_test)" 982 | ] 983 | }, 984 | { 985 | "cell_type": "code", 986 | "execution_count": 32, 987 | "metadata": {}, 988 | "outputs": [ 989 | { 990 | "data": { 991 | "text/plain": [ 992 | "73.40795059822463" 993 | ] 994 | }, 995 | "execution_count": 32, 996 | "metadata": {}, 997 | "output_type": "execute_result" 998 | } 999 | ], 1000 | "source": [ 1001 | "test_acc" 1002 | ] 1003 | }, 1004 | { 1005 | "cell_type": "code", 1006 | "execution_count": null, 1007 | "metadata": {}, 1008 | "outputs": [], 1009 | "source": [] 1010 | } 1011 | ], 1012 | "metadata": { 1013 | "kernelspec": { 1014 | "display_name": "Python 3.9.13 ('project')", 1015 | "language": "python", 1016 | "name": "python3" 1017 | }, 1018 | "language_info": { 1019 | "codemirror_mode": { 1020 | "name": "ipython", 1021 | "version": 3 1022 | }, 1023 | "file_extension": ".py", 1024 | "mimetype": "text/x-python", 1025 | "name": "python", 1026 | "nbconvert_exporter": "python", 1027 | "pygments_lexer": "ipython3", 1028 | "version": "3.9.13" 1029 | }, 1030 | "orig_nbformat": 4, 1031 | "vscode": { 1032 | "interpreter": { 1033 | "hash": "ae0234c7b3f04e6eafca990e433740df3b8489045b2079dac0d895dfea655336" 1034 | } 1035 | } 1036 | }, 1037 | "nbformat": 4, 1038 | "nbformat_minor": 2 1039 | } 1040 | -------------------------------------------------------------------------------- /WeatherCNNTraining/Weather_Model.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayant1211/Image-Tampering-Detection-using-ELA-and-Metadata-Analysis/ed68e34c5a8424bce8f9747b214ca0dbde6dbd5a/WeatherCNNTraining/Weather_Model.h5 -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | import cv2 3 | import os 4 | import numpy as np 5 | from keras.models import load_model 6 | from helper import prepare_image_for_ela, prerpare_img_for_weather 7 | from fetchOriginal import image_coordinates, get_weather 8 | from PIL import Image as PILImage 9 | import io 10 | 11 | # Constants 12 | class_weather = ['Lightning', 'Rainy', 'Snow', 'Sunny'] 13 | class_ELA = ['Real', 'Tampered'] 14 | outdoor = False 15 | 16 | # Functions 17 | def check_img(image_name): 18 | img = cv2.resize(cv2.imread(image_name), (750, 750)) 19 | return img 20 | 21 | def detect_ELA(img_name): 22 | global ela_result 23 | np_img_input, ela_result = prepare_image_for_ela(img_name) 24 | ELA_model = load_model('ELA_Training/model_ela.h5') 25 | Y_predicted = ELA_model.predict(np_img_input, verbose=0) 26 | return "Model shows {}% accuracy of image being {}".format(round(np.max(Y_predicted[0]) * 100), class_ELA[np.argmax(Y_predicted[0])]) 27 | 28 | def detect_weather(img_name): 29 | np_img_input = prerpare_img_for_weather(img_name) 30 | model_Weather = load_model('WeatherCNNTraining/Weather_Model.h5') 31 | Y_predicted = model_Weather.predict(np_img_input, verbose=0) 32 | return "Model shows weather in Image is {} ({}% accurate)".format(class_weather[np.argmax(Y_predicted[0])],round(np.max(Y_predicted[0]) * 100)) 33 | 34 | def org_weather(img_name): 35 | global outdoor 36 | date_time, lat, long, outdoor = image_coordinates(img_name) 37 | if not outdoor: 38 | return 39 | print(lat) 40 | location, date, weather = get_weather(date_time, lat, long) 41 | if lat == 0.0: 42 | return "Not able to fetch location. (some devices may mask location exif info)." 43 | if weather == "NA": 44 | return "The Image was taken at {} on {}; weather data not available".format(location, date) 45 | return "The Image was taken at {} and weather there on {} was {}".format(location, date, weather) 46 | 47 | # Streamlit Interface 48 | st.title("Image Tampering Detection Using ELA and Metadata Analysis") 49 | 50 | st.markdown(""" 51 | ### Welcome to the Image Tampering Detector! 52 | **What This Project Does:** 53 | This tool helps you determine whether an image has been altered or manipulated. Try it out and see if your images hold up under scrutiny! 54 | """) 55 | with st.expander("How it Works?"): 56 | st.markdown(""" 57 | There are two parallels that are being used to identify an image's authenticity: 58 | 59 | 1. **Error Level Analysis (ELA):** 60 | - Images that are edited often show different compression artifacts compared to the original ones. ELA highlights these discrepancies, making tampering visible. 61 | """) 62 | 63 | # Create columns for horizontal layout 64 | col1, col2 = st.columns(2) 65 | 66 | # Display ELA images in columns 67 | with col1: 68 | st.image("rsc/real.jpg", caption="ELA of a Real Image", use_column_width=True) 69 | 70 | with col2: 71 | st.image("rsc/fake.jpg", caption="ELA of a Tampered Image", use_column_width=True) 72 | 73 | st.markdown(""" 74 | Notice how ELA on real image shows consistency across the image but on fake image, ELA shows discrepancy across some regions. 75 | 76 | 2. **Weather Validation:** 77 | - **Purpose:** Weather Validation examines the metadata embedded in the image to cross-check if the depicted weather conditions are consistent with historical weather data from the image's recorded location and time. 78 | - **How?:** 79 | Images often contain metadata that includes information about the location, date, and time when the image was taken. 80 | Using this metadata, historical weather databases are queried to retrieve the weather conditions for the recorded location and date. 81 | Then actual weather conditions in the image are compared (as identified by a Weather CNN model) with the historical data to determine if they match. 82 | - **Why It Matters:** This helps in verifying the authenticity of outdoor images by ensuring that the weather depicted matches what was recorded historically for that location and time. Discrepancies can indicate tampering or misrepresentation. 83 | """) 84 | with st.expander("How to use it?"): 85 | st.markdown(""" 86 | 1. **Upload an Image:** Choose an image to analyze. 87 | 2. **Select the Outdoor Option:** Indicate whether the image is taken outdoors. 88 | 3. **View Results:** Get insights into the image’s authenticity with detailed analysis. 89 | 90 | """) 91 | 92 | with st.expander("Got a Query?"): 93 | st.markdown(""" 94 | Hi, I'm Jayant 95 | 96 | If you have any questions, feedback, suggestions, or just want to chat, feel free to reach out! 97 | 98 | - [Linkedin](https://www.linkedin.com/in/jayantmeshram/) 99 | - [Github](https://github.com/jayant1211) 100 | 101 | you can also email me at jayantmeshram398@gmail.com. 102 | """) 103 | 104 | 105 | # Initialize session state 106 | if 'step' not in st.session_state: 107 | st.session_state.step = 0 108 | 109 | # Handle file upload 110 | uploaded_file = st.file_uploader("Choose a .jpg/.jpeg image...", type=["jpg", "jpeg"]) 111 | 112 | if uploaded_file is not None: 113 | with open("temp.jpg", "wb") as f: 114 | f.write(uploaded_file.getbuffer()) 115 | 116 | st.image(uploaded_file, caption="Uploaded Image", use_column_width=True) 117 | flag = st.radio("Is weather visible in the image? (requires image metadata)", ('Yes', 'No')) 118 | 119 | if st.button("Proceed") and st.session_state.step == 0: 120 | st.session_state.step = 1 121 | 122 | # Show results if step > 0 123 | if st.session_state.step > 0: 124 | org = check_img("temp.jpg") 125 | res1 = detect_ELA("temp.jpg") 126 | res2, res3 = '', '' 127 | if flag == 'Yes': 128 | res2 = org_weather("temp.jpg") 129 | res3 = detect_weather("temp.jpg") 130 | 131 | st.write("### Results:") 132 | st.write("1. " + res1) 133 | if flag == "Yes": 134 | if not outdoor: 135 | st.write("Trouble fetching exif. Image do not have location or time metadata. (some devices may mask location exif info).") 136 | else: 137 | st.write("2. " + res2) 138 | st.write("3. " + res3) 139 | 140 | if st.button("Show Error Level Analysis") and st.session_state.step == 1: 141 | # Display ELA result image 142 | st.image(ela_result, caption="ELA Analysis") 143 | 144 | #TODO ela img goes away, add session step here 145 | 146 | # Save ELA result image to a BytesIO object 147 | buffer = io.BytesIO() 148 | ela_result.save(buffer, format="JPEG") # ela_result should be a PIL Image 149 | buffer.seek(0) 150 | 151 | # Add a download button for the ELA result image 152 | st.download_button( 153 | label="Save ELA Result Image", 154 | data=buffer, 155 | file_name="ela_result.jpg", 156 | mime="image/jpeg" 157 | ) 158 | 159 | # Button to reset the session state and allow new image upload 160 | if st.button("Try New Image"): 161 | st.session_state.step = 0 162 | #st.experimental_rerun() is not working 163 | st.rerun() 164 | -------------------------------------------------------------------------------- /fetchOriginal.py: -------------------------------------------------------------------------------- 1 | #WEATHER API 2 | #https://archive-api.open-meteo.com/v1/era5?latitude=18.52&longitude=73.86&start_date=2022-07-14&end_date=2022-07-14 3 | #&hourly=weathercode&timezone=Asia%2FBangkok 4 | 5 | import urllib 6 | from exif import Image 7 | from urllib.request import urlopen 8 | import json 9 | from geopy.geocoders import Nominatim 10 | 11 | 12 | 13 | '''0: 'Clear sky' 14 | 1, 2, 3 : 'Mainly clear, partly cloudy, and overcast' 15 | 45, 48 Fog and depositing rime fog 16 | 51, 53, 55 Drizzle: Light, moderate, and dense intensity 17 | 56, 57 Freezing Drizzle: Light and dense intensity 18 | 61, 63, 65 Rain: Slight, moderate and heavy intensity 19 | 66, 67 Freezing Rain: Light and heavy intensity 20 | 71, 73, 75 Snow fall: Slight, moderate, and heavy intensity 21 | 77 Snow grains 22 | 80, 81, 82 Rain showers: Slight, moderate, and violent 23 | 85, 86 Snow showers slight and heavy 24 | 95 * Thunderstorm: Slight or moderate 25 | 96, 99 * Thunderstorm with slight and heavy hail''' 26 | weatherDict = {} 27 | weatherDict[0] = 'Sunny' 28 | for key in [1, 2]: 29 | weatherDict[key] = 'Clear or partly cloudy' 30 | weatherDict[3] = 'Slight Rain' 31 | for key in [45, 48]: 32 | weatherDict[key] = 'Fog' 33 | for key in [51, 53, 55,56, 57]: 34 | weatherDict[key] = 'Slight Raining' 35 | for key in [61, 63, 65,66, 67,80, 81, 82]: 36 | weatherDict[key] = 'Raining Raining' 37 | for key in [45, 48,71, 73, 75,77,85, 86]: 38 | weatherDict[key] = 'Snow' 39 | for key in [95,96,99]: 40 | weatherDict[key] = 'Lightning' 41 | 42 | params = {} 43 | base_url = 'https://archive-api.open-meteo.com/v1/era5?' 44 | 45 | #https://stackoverflow.com/questions/64113710/extracting-gps-coordinates-from-image-using-python 46 | def decimal_coords(coords, ref): 47 | decimal_degrees = coords[0] + coords[1] / 60 + coords[2] / 3600 48 | if ref == "S" or ref =='W' : 49 | decimal_degrees = -decimal_degrees 50 | return decimal_degrees 51 | 52 | def image_coordinates(image_path): 53 | outdoor = True 54 | with open(image_path, 'rb') as src: 55 | img = Image(src) 56 | if img.has_exif: 57 | try: 58 | img.gps_longitude 59 | coords = (decimal_coords(img.gps_latitude,img.gps_latitude_ref), 60 | decimal_coords(img.gps_longitude, 61 | img.gps_longitude_ref)) 62 | except AttributeError: 63 | outdoor = False 64 | print("No Coordinates found.") 65 | return None, None, None, outdoor 66 | else: 67 | print("The Image has no EXIF information.") 68 | outdoor = False 69 | return None, None, None, outdoor 70 | 71 | try: 72 | date_time = img.datetime_original 73 | except AttributeError: 74 | try: 75 | date_time = img.gps_datestamp 76 | date_time += " 12:00:00" 77 | except: 78 | print("The Image has no EXIF information.") 79 | outdoor = False 80 | return None, None, None, outdoor 81 | latitude = coords[0] 82 | longitude = coords[1] 83 | #print({"imageTakenTime":img.datetime_original, "geolocation_lat":coords[0],"geolocation_lng":coords[1]}) 84 | return date_time,latitude,longitude,outdoor 85 | 86 | #date_time,lat,long = image_coordinates('MetaData/img2.jpg') 87 | 88 | def get_weather(date_time,lat,long): 89 | #2022:12:01 12:09:65 90 | date = date_time[:10] 91 | time = date_time[11:] 92 | 93 | date = date.replace(':','-') 94 | params['Date'] = date 95 | params['Time'] = time 96 | params['Longitude'] = long 97 | params['Latitude'] = lat 98 | 99 | geoLoc = Nominatim(user_agent="GetLoc") 100 | 101 | # passing the coordinates 102 | locname = geoLoc.reverse("{},{}".format(lat,long)) 103 | url = base_url + 'latitude={}&longitude={}&start_date={}&end_date={}&hourly=weathercode&timezone=Asia%2FBangkok'.format(params['Latitude'],params['Longitude'],params['Date'],params['Date']) 104 | 105 | response = urlopen(url) 106 | data_json = json.loads(response.read()) 107 | 108 | weather_code = data_json['hourly']['weathercode'] 109 | 110 | hour = int(time[:2]) 111 | if weather_code[hour-1] is None: 112 | return locname, date, "NA" 113 | 114 | return locname, date, weatherDict[weather_code[hour-1]] 115 | 116 | 117 | 118 | 119 | 120 | -------------------------------------------------------------------------------- /helper.py: -------------------------------------------------------------------------------- 1 | import os 2 | import cv2 3 | from PIL import Image, ImageChops, ImageEnhance 4 | import numpy as np 5 | 6 | def convert_to_ela_image(path, quality): 7 | temp_filename = 'temp_file_name.jpg' 8 | ela_filename = 'temp_ela.png' 9 | image = Image.open(path).convert('RGB') 10 | image.save(temp_filename, 'JPEG', quality = quality) 11 | temp_image = Image.open(temp_filename) 12 | 13 | ela_image = ImageChops.difference(image, temp_image) 14 | 15 | extrema = ela_image.getextrema() 16 | max_diff = sum([ex[1] for ex in extrema])/3 17 | if max_diff == 0: 18 | max_diff = 1 19 | 20 | scale = 255.0 / max_diff 21 | ela_image = ImageEnhance.Brightness(ela_image).enhance(scale) 22 | 23 | return ela_image 24 | 25 | def prepare_image_for_ela(image_path): 26 | ela_img = convert_to_ela_image(image_path, 90) 27 | img = np.array(ela_img.resize((128,128))).flatten() / 255.0 28 | img = img.reshape(128,128,3) 29 | return np.expand_dims(img, axis=0),ela_img 30 | 31 | def prerpare_img_for_weather(image_path): 32 | img = np.array(Image.open(image_path).convert('RGB').resize((128,128)))/255.0 33 | img = img.reshape(128,128,3) 34 | return np.expand_dims(img, axis=0) 35 | -------------------------------------------------------------------------------- /imgs/edited.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayant1211/Image-Tampering-Detection-using-ELA-and-Metadata-Analysis/ed68e34c5a8424bce8f9747b214ca0dbde6dbd5a/imgs/edited.jpg -------------------------------------------------------------------------------- /imgs/fake1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayant1211/Image-Tampering-Detection-using-ELA-and-Metadata-Analysis/ed68e34c5a8424bce8f9747b214ca0dbde6dbd5a/imgs/fake1.jpg -------------------------------------------------------------------------------- /imgs/org1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayant1211/Image-Tampering-Detection-using-ELA-and-Metadata-Analysis/ed68e34c5a8424bce8f9747b214ca0dbde6dbd5a/imgs/org1.jpg -------------------------------------------------------------------------------- /imgs/org2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayant1211/Image-Tampering-Detection-using-ELA-and-Metadata-Analysis/ed68e34c5a8424bce8f9747b214ca0dbde6dbd5a/imgs/org2.jpg -------------------------------------------------------------------------------- /imgs/step1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayant1211/Image-Tampering-Detection-using-ELA-and-Metadata-Analysis/ed68e34c5a8424bce8f9747b214ca0dbde6dbd5a/imgs/step1.jpg -------------------------------------------------------------------------------- /imgs/step2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayant1211/Image-Tampering-Detection-using-ELA-and-Metadata-Analysis/ed68e34c5a8424bce8f9747b214ca0dbde6dbd5a/imgs/step2.jpg -------------------------------------------------------------------------------- /imgs/step3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayant1211/Image-Tampering-Detection-using-ELA-and-Metadata-Analysis/ed68e34c5a8424bce8f9747b214ca0dbde6dbd5a/imgs/step3.jpg -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | absl-py==2.1.0 2 | altair==5.3.0 3 | astunparse==1.6.3 4 | attrs==23.2.0 5 | blinker==1.8.2 6 | cachetools==5.4.0 7 | certifi==2024.7.4 8 | charset-normalizer==3.3.2 9 | click==8.1.7 10 | contourpy==1.2.1 11 | cycler==0.12.1 12 | exif==1.6.0 13 | flatbuffers==24.3.25 14 | fonttools==4.53.1 15 | gast==0.6.0 16 | geographiclib==2.0 17 | geopy==2.4.1 18 | gitdb==4.0.11 19 | GitPython==3.1.43 20 | google-auth==2.32.0 21 | google-auth-oauthlib==1.2.1 22 | google-pasta==0.2.0 23 | grpcio==1.65.1 24 | h5py==3.11.0 25 | idna==3.7 26 | Jinja2==3.1.4 27 | joblib==1.4.2 28 | jsonschema==4.23.0 29 | jsonschema-specifications==2023.12.1 30 | keras==2.15.0 31 | kiwisolver==1.4.5 32 | libclang==18.1.1 33 | Markdown==3.6 34 | markdown-it-py==3.0.0 35 | MarkupSafe==2.1.5 36 | matplotlib==3.9.1 37 | mdurl==0.1.2 38 | ml-dtypes==0.2.0 39 | numpy==1.26.4 40 | oauthlib==3.2.2 41 | opencv-python-headless 42 | opt-einsum==3.3.0 43 | pandas==2.2.2 44 | pillow==10.4.0 45 | plum-py==0.8.7 46 | protobuf==4.25.3 47 | pyarrow==17.0.0 48 | pyasn1==0.6.0 49 | pyasn1_modules==0.4.0 50 | pydeck==0.9.1 51 | pyparsing==3.1.2 52 | pytz==2024.1 53 | referencing==0.35.1 54 | requests==2.32.3 55 | requests-oauthlib==2.0.0 56 | rich==13.7.1 57 | rpds-py==0.19.1 58 | rsa==4.9 59 | scikit-learn==1.5.1 60 | scipy==1.14.0 61 | smmap==5.0.1 62 | streamlit==1.37.0 63 | tenacity==8.5.0 64 | tensorboard==2.15.2 65 | tensorboard-data-server==0.7.2 66 | tensorflow==2.15.0 67 | tensorflow-estimator==2.15.0 68 | tensorflow-io-gcs-filesystem==0.37.1 69 | termcolor==2.4.0 70 | threadpoolctl==3.5.0 71 | toml==0.10.2 72 | toolz==0.12.1 73 | tzdata==2024.1 74 | urllib3==2.2.2 75 | Werkzeug==3.0.3 76 | wrapt==1.14.1 -------------------------------------------------------------------------------- /res/fake1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayant1211/Image-Tampering-Detection-using-ELA-and-Metadata-Analysis/ed68e34c5a8424bce8f9747b214ca0dbde6dbd5a/res/fake1.jpg -------------------------------------------------------------------------------- /res/org2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayant1211/Image-Tampering-Detection-using-ELA-and-Metadata-Analysis/ed68e34c5a8424bce8f9747b214ca0dbde6dbd5a/res/org2.jpg -------------------------------------------------------------------------------- /rsc/ela.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayant1211/Image-Tampering-Detection-using-ELA-and-Metadata-Analysis/ed68e34c5a8424bce8f9747b214ca0dbde6dbd5a/rsc/ela.jpg -------------------------------------------------------------------------------- /rsc/fake.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayant1211/Image-Tampering-Detection-using-ELA-and-Metadata-Analysis/ed68e34c5a8424bce8f9747b214ca0dbde6dbd5a/rsc/fake.jpg -------------------------------------------------------------------------------- /rsc/fake_img.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayant1211/Image-Tampering-Detection-using-ELA-and-Metadata-Analysis/ed68e34c5a8424bce8f9747b214ca0dbde6dbd5a/rsc/fake_img.jpg -------------------------------------------------------------------------------- /rsc/real.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jayant1211/Image-Tampering-Detection-using-ELA-and-Metadata-Analysis/ed68e34c5a8424bce8f9747b214ca0dbde6dbd5a/rsc/real.jpg --------------------------------------------------------------------------------