|
|
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 |
|
|
|
|
|
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() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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) |
|
|
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: |
|
|
|
|
|
model_M1 = tf.keras.models.load_model("IMVIP_Supplementary_Material/models/model1/") |
|
|
model_M2 = tf.keras.models.load_model("IMVIP_Supplementary_Material/models/model2/") |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
|
|
|
|