TruthLens commited on
Commit
d67c44a
·
verified ·
1 Parent(s): f31bdd1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +54 -36
app.py CHANGED
@@ -1,46 +1,64 @@
1
  import streamlit as st
 
2
  from PIL import Image
3
- from transformers import AutoFeatureExtractor, AutoModelForImageClassification
4
- import torch
5
  import requests
 
6
  from io import BytesIO
7
 
8
- # Load deepfake detection model and extractor
9
- model_name = "systemkc/deepfake-detection-v1" # Example model (replace if needed)
10
- extractor = AutoFeatureExtractor.from_pretrained(model_name)
11
- model = AutoModelForImageClassification.from_pretrained(model_name)
12
 
13
- st.title("Deepfake Thumbnail Detector")
14
- st.write("Upload a YouTube video link, and we’ll analyze the thumbnail to check for deepfakes.")
15
 
16
- video_url = st.text_input("Enter YouTube Video Link:")
17
- submit = st.button("Detect Deepfake")
 
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
- if submit and video_url:
20
- try:
21
- video_id = video_url.split("v=")[-1].split("&")[0] if "v=" in video_url else video_url.split("/")[-1]
22
- thumbnail_url = f"https://img.youtube.com/vi/{video_id}/maxresdefault.jpg"
23
- response = requests.get(thumbnail_url)
24
- response.raise_for_status()
 
 
 
 
 
 
25
 
26
- image = Image.open(BytesIO(response.content))
27
- st.image(image, caption="Video Thumbnail", use_container_width=True)
28
-
29
- # Preprocess and predict
30
- inputs = extractor(images=image, return_tensors="pt")
31
- with torch.no_grad():
32
- outputs = model(**inputs)
33
- logits = outputs.logits
34
- predicted_class = torch.argmax(logits, dim=1).item()
35
- confidence = torch.softmax(logits, dim=1)[0, predicted_class].item()
36
-
37
- # Interpret results
38
- if predicted_class == 1: # Assuming class 1 = Deepfake
39
- st.error(f"🚨 **Deepfake Detected** (Confidence: {confidence:.2%})")
40
- st.write("⚠️ Indicators of manipulation detected in the thumbnail.")
 
 
41
  else:
42
- st.success(f" **No Deepfake Detected** (Confidence: {confidence:.2%})")
43
- st.write("👍 Thumbnail appears authentic based on the model’s analysis.")
44
-
45
- except Exception as e:
46
- st.error(f"Error: {str(e)}")
 
1
  import streamlit as st
2
+ from transformers import pipeline
3
  from PIL import Image
 
 
4
  import requests
5
+ from urllib.parse import urlparse, parse_qs
6
  from io import BytesIO
7
 
8
+ # Initialize the deepfake detection model
9
+ @st.cache_resource
10
+ def load_model():
11
+ return pipeline("image-classification", model="Wvolf/ViT_Deepfake_Detection")
12
 
13
+ model = load_model()
 
14
 
15
+ def get_thumbnail_url(video_url):
16
+ """
17
+ Extracts the YouTube video ID and returns the thumbnail URL.
18
+ """
19
+ parsed_url = urlparse(video_url)
20
+ video_id = None
21
+ if 'youtube' in parsed_url.netloc:
22
+ query_params = parse_qs(parsed_url.query)
23
+ video_id = query_params.get('v', [None])[0]
24
+ elif 'youtu.be' in parsed_url.netloc:
25
+ video_id = parsed_url.path.lstrip('/')
26
+
27
+ if video_id:
28
+ return f"https://img.youtube.com/vi/{video_id}/maxresdefault.jpg"
29
+ return None
30
 
31
+ def analyze_thumbnail(thumbnail_url):
32
+ """
33
+ Downloads the thumbnail image and analyzes it using the deepfake detection model.
34
+ """
35
+ response = requests.get(thumbnail_url)
36
+ if response.status_code == 200:
37
+ image = Image.open(BytesIO(response.content)).convert("RGB")
38
+ results = model(image)
39
+ return results, image
40
+ else:
41
+ st.error("Failed to retrieve the thumbnail image.")
42
+ return None, None
43
 
44
+ # Streamlit UI
45
+ st.title("Deepfake Detection from YouTube Thumbnails")
46
+ video_url = st.text_input("Enter YouTube Video URL:")
47
+ if st.button("Analyze"):
48
+ if video_url:
49
+ thumbnail_url = get_thumbnail_url(video_url)
50
+ if thumbnail_url:
51
+ results, image = analyze_thumbnail(thumbnail_url)
52
+ if results and image:
53
+ st.image(image, caption="YouTube Video Thumbnail", use_column_width=True)
54
+ st.subheader("Detection Results:")
55
+ for result in results:
56
+ label = result['label']
57
+ confidence = result['score'] * 100
58
+ st.write(f"**{label}**: {confidence:.2f}%")
59
+ else:
60
+ st.error("Could not analyze the thumbnail.")
61
  else:
62
+ st.error("Invalid YouTube URL. Please enter a valid URL.")
63
+ else:
64
+ st.warning("Please enter a YouTube video URL.")