David Fischinger
added test images
f5d6164
raw
history blame
No virus
5.2 kB
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)
#### Select example image or upload your own image:
"""
IMG_SIZE=256
tf.experimental.numpy.experimental_enable_numpy_behavior()
#np.warnings.filterwarnings('error', category=np.VisibleDeprecationWarning)
model_M1 = None
model_M2 = None
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.")
def start_evaluation(uploaded_file):
#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.models.load_model("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)
st.markdown(DESCRIPTION)
img_path1 = "example_images/Sp_D_NRD_A_nat0095_art0058_0582"
img_path2 = "example_images/Sp_D_NRN_A_nat0083_arc0080_0445"
img_path3 = "example_images/Sp_D_NRN_A_ani0088_cha0044_0441"
image_paths = [img_path1+".jpg", img_path2+".jpg", img_path3+".jpg"]
gt_paths = [img_path1+"_gt.png", img_path2+"_gt.png", img_path3+"_gt.png"]
# Display images in a table format
img = None
for idx, image_path in enumerate(image_paths):
cols = st.columns([2, 2, 2, 2]) # Define column widths
# Place the button in the first column
if cols[0].button(f"Select Image {idx+1}", key=idx):
img = Image.open(image_path)
# Place the image in the second column
with cols[1]:
st.image(image_path, use_column_width=True, caption="Example Image "+str(idx+1))
# Place the ground truth in the third column
with cols[2]:
st.image(gt_paths[idx], use_column_width=True, caption="Ground Truth")
if img is not None:
start_evaluation(img)
def reset_image_select():
img = None
def start_evaluation(uploaded_file):
#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.models.load_model("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)
uploaded_file= None
uploaded_file = st.file_uploader("Please upload an image", type=["jpeg", "jpg", "png"], on_change=reset_image_select)
if (uploaded_file is not None) and (img is None):
start_evaluation(uploaded_file)