File size: 13,887 Bytes
39abc8d 56e3c29 bd1ee8d ad42a25 ab79ce6 4578e0e bd1ee8d 3a45cce bd1ee8d 51b55ad 97e3cb7 bd1ee8d 51b55ad 3a45cce 51b55ad 2405a2e e8ac83a 2405a2e aa04eaf 2405a2e bd1ee8d 2405a2e 1028a4f e8ac83a 3a45cce 1b584d1 51b55ad e8ac83a b7adf74 e8ac83a 97e3cb7 129f79a a2b682b bde75ba e8ac83a ca98ddd e8ac83a 6b123b3 3a45cce bd1ee8d c56f4ca ab79ce6 2405a2e bd1ee8d 2405a2e c56f4ca 2405a2e c56f4ca 2405a2e bd1ee8d 33475d9 3a45cce 49b55eb 8eb6c20 4578e0e bd1ee8d c51b4df bd1ee8d 5242e79 bd1ee8d 2405a2e 494b03f 5242e79 494b03f 5242e79 bd1ee8d 5242e79 494b03f 5242e79 bd1ee8d 5242e79 bd1ee8d 5242e79 bd1ee8d c7fed8b db588d5 3be8719 db588d5 c2106ae db588d5 8eb6c20 c2106ae 8eb6c20 4578e0e c7fed8b c2106ae c7fed8b 494b03f c2106ae 494b03f c7fed8b 8024e38 c7fed8b 8eb6c20 c7fed8b 9eb2d43 f48dce0 c51b4df a1e3e84 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 |
import streamlit as st
import numpy as np
import cv2
import tempfile
import requests
from PIL import Image
from pytube import YouTube
import os
from PIL import Image
import tensorflow as tf
from transformers import pipeline
from tensorflow.keras.applications import Xception, EfficientNetB7
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
from tensorflow.keras.preprocessing.image import load_img, img_to_array
# ---- Page Configuration ----
st.set_page_config(page_title="Fake & Deepfake Detection", layout="wide")
st.title("๐ฐ Fake News & Deepfake Detection Tool")
st.write("๐ Detect Fake News, Deepfake Images, and Videos using AI")
# Load Models
fake_news_detector = pipeline("text-classification", model="microsoft/deberta-v3-base")
@st.cache_resource
def load_fake_news_model():
return pipeline("text-classification", model="microsoft/deberta-v3-base")
@st.cache_resource
def load_deepfake_models():
base_model_image = Xception(weights="imagenet", include_top=False)
base_model_image.trainable = False
x = GlobalAveragePooling2D()(base_model_image.output)
x = Dense(1024, activation="relu")(x)
x = Dense(1, activation="sigmoid")(x)
deepfake_image_model = Model(inputs=base_model_image.input, outputs=x)
base_model_video = EfficientNetB7(weights="imagenet", include_top=False)
base_model_video.trainable = False
x = GlobalAveragePooling2D()(base_model_video.output)
x = Dense(1024, activation="relu")(x)
x = Dense(1, activation="sigmoid")(x)
deepfake_video_model = Model(inputs=base_model_video.input, outputs=x)
return deepfake_image_model, deepfake_video_model
# Load models once in cache
fake_news_detector = load_fake_news_model()
deepfake_image_model, deepfake_video_model = load_deepfake_models()
# Load Deepfake Detection Models
base_model_image = Xception(weights="imagenet", include_top=False)
base_model_image.trainable = False # Freeze base layers
x = GlobalAveragePooling2D()(base_model_image.output)
x = Dense(1024, activation="relu")(x)
x = Dense(1, activation="sigmoid")(x) # Sigmoid for probability output
deepfake_image_model = Model(inputs=base_model_image.input, outputs=x)
base_model_video = EfficientNetB7(weights="imagenet", include_top=False)
base_model_video.trainable = False
x = GlobalAveragePooling2D()(base_model_video.output)
x = Dense(1024, activation="relu")(x)
x = Dense(1, activation="sigmoid")(x)
deepfake_video_model = Model(inputs=base_model_video.input, outputs=x)
# Function to Preprocess Image
def preprocess_image(image_path):
img = load_img(image_path, target_size=(100, 100)) # Xception expects 299x299
img = img_to_array(img)
img = np.expand_dims(img, axis=0)
img /= 255.0 # Normalize pixel values
return img
# Function to Detect Deepfake Image
def detect_deepfake_image(image_path):
image = preprocess_image(image_path)
prediction = deepfake_image_model.predict(image)[0][0]
confidence = round(float(prediction), 2)
label = "FAKE" if confidence > 0.5 else "REAL"
return {"label": label, "score": confidence}
# ---- Fake News Detection Section ----
st.subheader("๐ Fake News Detection")
news_input = st.text_area("Enter News Text:", placeholder="Type here...")
# Manually verified facts database (you can expand this)
fact_check_db = {
"elon musk was born in 1932": "FAKE",
"earth revolves around the sun": "REAL",
"the moon is made of cheese": "FAKE",
"water boils at 100 degrees celsius": "REAL",
"the great wall of china is visible from space": "FAKE",
"human beings need oxygen to survive": "REAL",
"vaccines cause autism": "FAKE",
"the sun rises in the west": "FAKE",
"chocolate is toxic to dogs": "REAL",
"microsoft was founded by bill gates": "REAL",
"dinosaurs and humans lived together": "FAKE",
"the eiffel tower is in italy": "FAKE",
"the speed of light is faster than sound": "REAL",
"5g technology spreads covid-19": "FAKE",
"honey never spoils": "REAL",
"napoleon was extremely short": "FAKE",
"goldfish have a three-second memory": "FAKE",
"einstein failed math in school": "FAKE",
"birds are descendants of dinosaurs": "REAL",
"water is composed of hydrogen and oxygen": "REAL",
"humans only use 10 percent of their brain": "FAKE",
"the human body has 206 bones": "REAL",
"the great pyramid of giza was built by aliens": "FAKE",
"the internet was invented in 1983": "REAL",
"earth is flat": "FAKE",
"bananas grow on trees": "FAKE",
"polar bears are left-handed": "FAKE",
"the amazon rainforest produces 20 percent of the world's oxygen": "REAL",
"dogs can see only black and white": "FAKE",
"lightning never strikes the same place twice": "FAKE",
"the shortest war lasted only 38 minutes": "REAL",
"there is no gravity in space": "FAKE",
"sharks do not get cancer": "FAKE",
"the human heart beats about 100,000 times a day": "REAL",
"albert einstein was a high school dropout": "FAKE",
"diamonds are formed from coal": "FAKE",
"the human tongue has different taste zones": "FAKE",
"tomatoes are a fruit": "REAL",
"a year on venus is shorter than a day": "REAL",
"vikings wore horned helmets": "FAKE",
"the moon has its own gravity": "REAL",
"sugar causes hyperactivity in children": "FAKE",
"human blood is blue inside the body": "FAKE",
"gold is edible": "REAL",
"ostriches bury their heads in the sand": "FAKE",
"earth is the only planet with water": "FAKE",
"black holes can evaporate": "REAL",
"a penny dropped from the empire state building can kill a person": "FAKE",
"octopuses have three hearts": "REAL",
"mars is red because of iron oxide": "REAL",
"eating carrots improves eyesight": "FAKE",
"the human nose and ears keep growing with age": "REAL",
"the leaning tower of pisa has always leaned": "REAL",
"bats are blind": "FAKE",
"you swallow eight spiders a year in your sleep": "FAKE",
"the statue of liberty was a gift from france": "REAL",
"light bulbs were invented by thomas edison": "REAL",
"chameleons change color to match their surroundings": "FAKE",
"dogs have unique nose prints": "REAL",
"some frogs can survive being frozen": "REAL",
"birds die if they eat rice": "FAKE",
"a group of crows is called a murder": "REAL",
"human dna is 60% similar to bananas": "REAL",
"snakes can dislocate their jaws": "REAL",
"the longest english word has 189,819 letters": "REAL",
"there are more trees on earth than stars in the milky way": "REAL",
"bananas are berries": "REAL",
"peanuts are nuts": "FAKE",
"avocados are poisonous to birds": "REAL",
"a day on mercury is longer than its year": "REAL",
"sharks existed before trees": "REAL",
"the olympics were originally held in greece": "REAL",
"human fingers have no muscles": "REAL",
"cows have best friends": "REAL",
"the inventor of the frisbee was turned into a frisbee after he died": "REAL",
"watermelon is 92% water": "REAL",
"new york was once called new amsterdam": "REAL",
"the heart of a blue whale is the size of a small car": "REAL",
"giraffes have the same number of neck bones as humans": "REAL",
"venus is the hottest planet in the solar system": "REAL",
"your hair and nails continue to grow after death": "FAKE",
"the sun is a star": "REAL",
"the human body glows in the dark but is invisible to the naked eye": "REAL",
"barbieโs full name is barbara millicent roberts": "REAL",
"ants can carry 50 times their own body weight": "REAL",
"rabbits canโt vomit": "REAL",
"the speed of sound is faster in water than in air": "REAL",
"every planet in our solar system could fit between earth and the moon": "REAL",
"a single lightning bolt is five times hotter than the sunโs surface": "REAL",
"mosquitoes are the deadliest animals on earth": "REAL",
"sea otters hold hands while sleeping": "REAL",
"the empire state building can be seen from space": "FAKE",
"your stomach gets a new lining every 3 to 4 days": "REAL",
"hummingbirds can fly backward": "REAL",
"a shrimpโs heart is in its head": "REAL",
"the eiffel tower grows in the summer": "REAL",
"neptune was the first planet discovered using math": "REAL"
}
def check_manual_facts(text):
text_lower = text.lower().strip()
return fact_check_db.get(text_lower, None)
if st.button("Check News"):
# st.write("๐ Processing...")
loading_placeholder = st.empty()
with loading_placeholder:
st.markdown("๐ Processing...", unsafe_allow_html=True)
# Check if the news is in the fact-check database
manual_result = check_manual_facts(news_input)
if manual_result:
if manual_result == "FAKE":
st.error(f"โ ๏ธ Result: This news is **FAKE** (Verified by Database).")
else:
st.success(f"โ
Result: This news is **REAL** (Verified by Database).")
else:
# Use AI model if fact is not in the database
prediction = fake_news_detector(news_input)
label = prediction[0]['label'].lower()
confidence = prediction[0]['score']
if "fake" in label or confidence < 0.5:
st.error(f"โ ๏ธ Result: This news is **FAKE**. (Confidence: {confidence:.2f})")
else:
st.success(f"โ
Result: This news is **REAL**. (Confidence: {confidence:.2f})")
st.subheader("๐ธ Deepfake Image Detection")
uploaded_image = st.file_uploader("Upload an Image", type=["jpg", "png", "jpeg"])
if uploaded_image is not None:
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".jpg")
img = Image.open(uploaded_image).convert("RGB")
img.save(temp_file.name, "JPEG")
# ๐ ๏ธ FIX: Set image width (e.g., 300 pixels)
st.image(temp_file.name, caption="๐ผ๏ธ Uploaded Image", width=300)
if st.button("Analyze Image"):
st.write("๐ Processing...")
# Assuming detect_deepfake_image() is a function that returns a dictionary with "label" and "score"
result = detect_deepfake_image(temp_file.name)
if result["label"] == "REAL":
st.success(f"โ
Result: This image is Real. (Confidence: {1 - result['score']:.2f})")
else:
st.error(f"โ ๏ธ Result: This image is a Deepfake. (Confidence: {result['score']:.2f})")
# ---- Deepfake Video Detection Section ----
st.subheader("๐ฅ Deepfake Video Detection")
# Upload video file
uploaded_video = st.file_uploader("Upload a Video", type=["mp4", "avi", "mov"])
# URL Input for Video (MP4 Direct Link or YouTube URL)
video_url = st.text_input("Enter Video URL (YouTube or MP4 Link)")
# Function to detect deepfake in video
def detect_deepfake_video(video_path):
cap = cv2.VideoCapture(video_path)
frame_scores = []
frame_count = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
if frame_count % 10 == 0:
frame_path = "temp_frame.jpg"
cv2.imwrite(frame_path, frame)
result = detect_deepfake_image(frame_path)
frame_scores.append(result["score"])
os.remove(frame_path)
frame_count += 1
cap.release()
if not frame_scores:
return {"label": "UNKNOWN", "score": 0.0}
avg_score = np.mean(frame_scores)
confidence = round(float(avg_score), 2)
final_label = "FAKE" if avg_score > 0.5 else "REAL"
return {"label": final_label, "score": confidence}
# Download direct MP4 video
def download_video(url):
try:
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".mp4")
response = requests.get(url, stream=True)
if response.status_code == 200:
with open(temp_file.name, "wb") as f:
for chunk in response.iter_content(chunk_size=1024):
f.write(chunk)
return temp_file.name
else:
return None
except Exception as e:
return None
# โ
Display Video (YouTube Embed or Local)
video_path = None
if uploaded_video is not None:
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".mp4")
with open(temp_file.name, "wb") as f:
f.write(uploaded_video.read())
video_path = temp_file.name # Set video path for detection
st.video(video_path) # Show uploaded video
elif video_url:
if "youtube.com" in video_url or "youtu.be" in video_url:
st.markdown(
f'<iframe width="560" height="315" src="{video_url.replace("watch?v=", "embed/")}" frameborder="0" allowfullscreen></iframe>',
unsafe_allow_html=True,
)
else:
video_path = download_video(video_url) # Download MP4
if video_path:
st.video(video_path) # Show downloaded MP4
else:
st.warning("โ ๏ธ Invalid MP4 URL.")
# โ
"Analyze Video" Button (Only for Local/MP4)
if uploaded_video or (video_url and not "youtube.com" in video_url):
analyze_button = st.button("Analyze Video")
if analyze_button and video_path:
st.write("๐ Processing... Please wait.")
result = detect_deepfake_video(video_path)
if result["label"] == "FAKE":
st.error(f"โ ๏ธ Deepfake Detected! This video appears to be FAKE. (Confidence: {result['score']:.2f})")
elif result["label"] == "REAL":
st.success(f"โ
This video appears to be REAL. (Confidence: {1 - result['score']:.2f})")
else:
st.warning("โ ๏ธ Unable to analyze the video. Please try a different file.")
st.markdown("๐น **Developed for Fake News & Deepfake Detection**")
|