|
|
import gradio as gr
|
|
|
|
|
|
|
|
|
from image_backend import predict_image_pil
|
|
|
from audio_backend import predict_audio
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def analyze_image(image):
|
|
|
label, confidence, heatmap = predict_image_pil(image)
|
|
|
|
|
|
if label == "Fake":
|
|
|
if confidence >= 90:
|
|
|
risk = "π¨ High likelihood of Deepfake"
|
|
|
elif confidence >= 60:
|
|
|
risk = "β οΈ Possibly Deepfake"
|
|
|
else:
|
|
|
risk = "β οΈ Uncertain Deepfake"
|
|
|
else:
|
|
|
if confidence >= 90:
|
|
|
risk = "β
Likely Real"
|
|
|
elif confidence >= 60:
|
|
|
risk = "β οΈ Possibly Real"
|
|
|
else:
|
|
|
risk = "β οΈ Uncertain β Needs Review"
|
|
|
|
|
|
return label, f"{confidence} %", risk, heatmap
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def analyze_audio(audio_path):
|
|
|
label, confidence = predict_audio(audio_path)
|
|
|
|
|
|
if label == "fake":
|
|
|
if confidence >= 90:
|
|
|
risk = "π¨ High likelihood of Deepfake"
|
|
|
elif confidence >= 60:
|
|
|
risk = "β οΈ Possibly Deepfake"
|
|
|
else:
|
|
|
risk = "β οΈ Uncertain β Needs Review"
|
|
|
else:
|
|
|
if confidence >= 90:
|
|
|
risk = "β
Likely Real"
|
|
|
elif confidence >= 60:
|
|
|
risk = "β οΈ Possibly Real"
|
|
|
else:
|
|
|
risk = "β οΈ Uncertain β Needs Review"
|
|
|
|
|
|
return label.capitalize(), f"{confidence} %", risk
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
with gr.Blocks() as demo:
|
|
|
gr.Markdown("# π§ Unified Deepfake Detection System")
|
|
|
|
|
|
with gr.Tabs():
|
|
|
|
|
|
|
|
|
with gr.Tab("π Home"):
|
|
|
gr.Markdown(
|
|
|
"""
|
|
|
## Welcome π
|
|
|
Select the type of media you want to analyze:
|
|
|
"""
|
|
|
)
|
|
|
|
|
|
gr.Markdown("### π Choose Detection Mode")
|
|
|
gr.Markdown("- πΌ **Image Deepfake Detection**\n- π§ **Audio Deepfake Detection**")
|
|
|
|
|
|
gr.Markdown(
|
|
|
"""
|
|
|
π Use the tabs above to switch between Image and Audio detection.
|
|
|
"""
|
|
|
)
|
|
|
|
|
|
|
|
|
with gr.Tab("πΌ Image Deepfake"):
|
|
|
gr.Markdown("# πΌ Deepfake Image Detection System")
|
|
|
|
|
|
with gr.Row():
|
|
|
with gr.Column(scale=1):
|
|
|
image_input = gr.Image(
|
|
|
label="Upload Image",
|
|
|
type="pil",
|
|
|
height=280
|
|
|
)
|
|
|
img_submit = gr.Button("Submit")
|
|
|
img_clear = gr.Button("Clear")
|
|
|
|
|
|
with gr.Column(scale=2):
|
|
|
img_pred = gr.Text(label="Prediction")
|
|
|
img_conf = gr.Text(label="Confidence")
|
|
|
img_risk = gr.Text(label="Risk Assessment")
|
|
|
img_heatmap = gr.Image(
|
|
|
label="Explainability Heatmap",
|
|
|
height=280
|
|
|
)
|
|
|
|
|
|
img_submit.click(
|
|
|
fn=analyze_image,
|
|
|
inputs=image_input,
|
|
|
outputs=[img_pred, img_conf, img_risk, img_heatmap]
|
|
|
)
|
|
|
|
|
|
img_clear.click(
|
|
|
fn=lambda: (None, "", "", None),
|
|
|
inputs=None,
|
|
|
outputs=[image_input, img_pred, img_conf, img_risk]
|
|
|
)
|
|
|
|
|
|
|
|
|
with gr.Tab("π§ Audio Deepfake"):
|
|
|
gr.Markdown("# π§ Deepfake Audio Detection System")
|
|
|
|
|
|
with gr.Row():
|
|
|
with gr.Column(scale=1):
|
|
|
audio_input = gr.Audio(
|
|
|
label="Upload Audio (.wav)",
|
|
|
type="filepath"
|
|
|
)
|
|
|
aud_submit = gr.Button("Submit")
|
|
|
aud_clear = gr.Button("Clear")
|
|
|
|
|
|
with gr.Column(scale=2):
|
|
|
aud_pred = gr.Text(label="Prediction")
|
|
|
aud_conf = gr.Text(label="Confidence")
|
|
|
aud_risk = gr.Text(label="Risk Assessment")
|
|
|
|
|
|
aud_submit.click(
|
|
|
fn=analyze_audio,
|
|
|
inputs=audio_input,
|
|
|
outputs=[aud_pred, aud_conf, aud_risk]
|
|
|
)
|
|
|
|
|
|
aud_clear.click(
|
|
|
fn=lambda: (None, "", ""),
|
|
|
inputs=None,
|
|
|
outputs=[audio_input, aud_pred, aud_conf]
|
|
|
)
|
|
|
|
|
|
demo.launch()
|
|
|
|