├── 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 |
12 |
13 |
14 | #### Step 2
15 | Select if weather metadata is available
16 |
17 |
18 |
19 |
20 | #### Step 3
21 | Analyze the results
22 |
23 |
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 |
51 |
52 | ELA
53 | by doing this, we are essentially amplifying the variations caused by compression artifacts.
54 |
55 |
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 |
66 | Lighting
67 | rainy
68 | cloudy
69 | sunny
70 |
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
--------------------------------------------------------------------------------