Update app.py
Browse files
app.py
CHANGED
@@ -1,9 +1,15 @@
|
|
1 |
import streamlit as st
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
import torch
|
3 |
import torch.nn as nn
|
4 |
from torch.utils.data import DataLoader
|
5 |
from torchvision import transforms
|
6 |
-
from transformers import BlipProcessor, BlipForConditionalGeneration
|
7 |
from PIL import Image
|
8 |
import numpy as np
|
9 |
import io
|
@@ -11,10 +17,6 @@ import base64
|
|
11 |
import cv2
|
12 |
import matplotlib.pyplot as plt
|
13 |
from peft import PeftModel
|
14 |
-
from unsloth import FastVisionModel
|
15 |
-
import os
|
16 |
-
import tempfile
|
17 |
-
import warnings
|
18 |
from gradcam_xception import load_xception_model, generate_smoothgrad_visualizations_xception
|
19 |
warnings.filterwarnings("ignore", category=UserWarning)
|
20 |
|
@@ -466,6 +468,39 @@ def preprocess_image_xception(image):
|
|
466 |
input_tensor = transform(image).unsqueeze(0)
|
467 |
return input_tensor, image, None
|
468 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
469 |
# Main app
|
470 |
def main():
|
471 |
# Initialize session state variables
|
@@ -578,23 +613,20 @@ def main():
|
|
578 |
st.error(f"Error loading image from URL: {str(e)}")
|
579 |
|
580 |
with upload_tab3:
|
581 |
-
|
582 |
-
"Real face sample"
|
583 |
-
"Likely deepfake sample"
|
584 |
-
"Neutral face sample"
|
585 |
-
|
586 |
-
selected_sample = st.selectbox("Select a sample image:",
|
|
|
587 |
if st.button("Load Sample"):
|
588 |
-
|
589 |
-
|
590 |
-
|
591 |
-
if
|
592 |
-
uploaded_image = Image.open(io.BytesIO(response.content)).convert("RGB")
|
593 |
st.session_state.upload_method = "sample"
|
594 |
-
|
595 |
-
st.error(f"Failed to load sample image: Status code {response.status_code}")
|
596 |
-
except Exception as e:
|
597 |
-
st.error(f"Error loading sample image: {str(e)}")
|
598 |
|
599 |
# If we have an uploaded image, process it
|
600 |
if uploaded_image is not None:
|
|
|
1 |
import streamlit as st
|
2 |
+
import warnings
|
3 |
+
import os
|
4 |
+
import tempfile
|
5 |
+
# First load unsloth
|
6 |
+
from unsloth import FastVisionModel
|
7 |
+
# Then transformers
|
8 |
+
from transformers import BlipProcessor, BlipForConditionalGeneration
|
9 |
import torch
|
10 |
import torch.nn as nn
|
11 |
from torch.utils.data import DataLoader
|
12 |
from torchvision import transforms
|
|
|
13 |
from PIL import Image
|
14 |
import numpy as np
|
15 |
import io
|
|
|
17 |
import cv2
|
18 |
import matplotlib.pyplot as plt
|
19 |
from peft import PeftModel
|
|
|
|
|
|
|
|
|
20 |
from gradcam_xception import load_xception_model, generate_smoothgrad_visualizations_xception
|
21 |
warnings.filterwarnings("ignore", category=UserWarning)
|
22 |
|
|
|
468 |
input_tensor = transform(image).unsqueeze(0)
|
469 |
return input_tensor, image, None
|
470 |
|
471 |
+
# After the get_xception_transform function, add this function to use embedded sample images
|
472 |
+
|
473 |
+
def get_embedded_sample_image(sample_name):
|
474 |
+
"""Return a sample image embedded in the code to avoid URL issues"""
|
475 |
+
import base64
|
476 |
+
from PIL import Image
|
477 |
+
import io
|
478 |
+
|
479 |
+
# These are base64 encoded small sample images to avoid URL fetching
|
480 |
+
sample_images = {
|
481 |
+
"Real face sample": "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
|
482 |
+
",
|
483 |
+
"Likely deepfake sample": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCACAAIABAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APZc0UlFITUckyRjLMBVCfWbaLOXyfTNZtx4jt1/5aAj2zXO6p4wS3VmEm0Dr81cDrXxM1DcY7WMOw6qG
|
484 |
+
",
|
485 |
+
"Neutral face sample": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxEQEhUQEhIVFRUXFxgWGBcVGBcXGBgYGBcYFhgXFRcYHSggGBolGxUVITEhJSkrLi4uFx8zODMtNygtLisBCgoKDg0OGxAQGy0mICUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLf/AABEIAQEAxAMBIgACEQEDEQH/
|
486 |
+
"
|
487 |
+
}
|
488 |
+
|
489 |
+
if sample_name in sample_images:
|
490 |
+
try:
|
491 |
+
# Decode the base64 image
|
492 |
+
image_bytes = base64.b64decode(sample_images[sample_name])
|
493 |
+
# Create a PIL image from the bytes
|
494 |
+
return Image.open(io.BytesIO(image_bytes))
|
495 |
+
except Exception as e:
|
496 |
+
st.error(f"Error loading embedded sample image: {e}")
|
497 |
+
import traceback
|
498 |
+
st.error(traceback.format_exc())
|
499 |
+
else:
|
500 |
+
st.error(f"Unknown sample image: {sample_name}")
|
501 |
+
|
502 |
+
return None
|
503 |
+
|
504 |
# Main app
|
505 |
def main():
|
506 |
# Initialize session state variables
|
|
|
613 |
st.error(f"Error loading image from URL: {str(e)}")
|
614 |
|
615 |
with upload_tab3:
|
616 |
+
sample_options = [
|
617 |
+
"Real face sample",
|
618 |
+
"Likely deepfake sample",
|
619 |
+
"Neutral face sample"
|
620 |
+
]
|
621 |
+
selected_sample = st.selectbox("Select a sample image:", sample_options)
|
622 |
+
|
623 |
if st.button("Load Sample"):
|
624 |
+
with st.spinner(f"Loading sample image: {selected_sample}"):
|
625 |
+
# Use the embedded sample function instead of URL fetching
|
626 |
+
uploaded_image = get_embedded_sample_image(selected_sample)
|
627 |
+
if uploaded_image is not None:
|
|
|
628 |
st.session_state.upload_method = "sample"
|
629 |
+
st.success("Sample image loaded successfully!")
|
|
|
|
|
|
|
630 |
|
631 |
# If we have an uploaded image, process it
|
632 |
if uploaded_image is not None:
|