File size: 2,754 Bytes
a435037
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f3ef496
 
 
 
 
 
 
 
 
 
 
a435037
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82c22e3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a435037
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
from PIL import Image
import streamlit as st
import cv2
import numpy as np
import os
import tensorflow as tf

from IMVIP_Supplementary_Material.scripts import dfutils #methods used for DF-Net

DESCRIPTION = """# DF-Net
The Digital Forensics Network is designed and trained to detect and locate image manipulations. 
More information can be found in this [publication](https://zenodo.org/record/8214996)
"""

IMG_SIZE=256

tf.experimental.numpy.experimental_enable_numpy_behavior()
#np.warnings.filterwarnings('error', category=np.VisibleDeprecationWarning) 



def check_forgery_df(img):
    shape_original = img.shape
    img = cv2.resize(img, (IMG_SIZE,IMG_SIZE))
    x = np.expand_dims( img.astype('float32')/255., axis=0 )
    
    pred1 = model_M1.predict(x, verbose=0)
    pred2= model_M2.predict(x, verbose=0)   


    # Ensure pred1 and pred2 are numpy arrays before proceeding
    if isinstance(pred1, dict):
        print("pred1 is dict!")
        pred1 = pred1[next(iter(pred1))]
    if isinstance(pred2, dict):
        pred2 = pred2[next(iter(pred2))]

    
    pred = np.max([pred1,pred2], axis=0)   
    
    pred = dfutils.create_mask(pred)
    pred = pred.reshape(pred.shape[-3:-1])
    resized_image = cv2.resize(pred, (shape_original[1],shape_original[0]), interpolation=cv2.INTER_LINEAR)

    return resized_image



def evaluate(img):
    pre_t = check_forgery_df(img)
    st.image(pre_t, caption="White area indicates potential image manipulations.")



st.markdown(DESCRIPTION)

uploaded_file = st.file_uploader("Please upload an image", type=["jpeg", "jpg", "png"])

if uploaded_file is not None:
    #load models
    model_path1 = "IMVIP_Supplementary_Material/models/model1/"
    model_path2 = "IMVIP_Supplementary_Material/models/model2/"
    
    tfsm_layer1 = tf.keras.layers.TFSMLayer(model_path1, call_endpoint='serving_default')
    tfsm_layer2 = tf.keras.layers.TFSMLayer(model_path2, call_endpoint='serving_default')
    
    input_shape = (256, 256, 3)
    inputs = Input(shape=input_shape)

    #create the model
    outputs1 = tfsm_layer1(inputs)
    model_M1 = Model(inputs, outputs1)

    outputs2 = tfsm_layer2(inputs)
    model_M2 = Model(inputs, outputs2)
    
    #model_M1 = tf.keras.layers.TFSMLayer("IMVIP_Supplementary_Material/models/model1/") #tf.keras.models.load_model("IMVIP_Supplementary_Material/models/model1/")
    #model_M2 = tf.keras.models.load_model("IMVIP_Supplementary_Material/models/model2/")

    # Convert the file to an opencv image.
    file_bytes = np.asarray(bytearray(uploaded_file.read()), dtype=np.uint8)
    opencv_image = cv2.imdecode(file_bytes, 1)
    reversed_image = opencv_image[:, :, ::-1]
    st.image(reversed_image, caption="Input Image")
    evaluate(reversed_image)