VehicleIdentity / app.py
SuriRaja's picture
Update app.py
8051045 verified
Raw
History Blame Contribute Delete
4.3 kB
import streamlit as st
import pandas as pd
import cv2
import easyocr
import tempfile
import requests
import os
from datetime import datetime
# ✅ Google Drive API Key and Folder ID
API_KEY = "AIzaSyDojJrpauA0XZtCCDUuo9xeQHZQamYKsC4"
FOLDER_ID = "1egelZ7ZyHBNcXmtObX0CWfr_Q_ilfX9p"
LOG_FILE = "vehicle_log.csv"
FRAME_SKIP = 15 # Reduced to improve detection
reader = easyocr.Reader(['en'], gpu=False)
st.title("🚓 Improved Vehicle Detection from Google Drive CCTV")
# Ensure log file exists
if not os.path.exists(LOG_FILE):
pd.DataFrame(columns=["Vehicle Number", "Timestamp", "Video File"]).to_csv(LOG_FILE, index=False)
def list_drive_files(folder_id):
url = f"https://www.googleapis.com/drive/v3/files?q='{folder_id}'+in+parents+and+(mimeType='video/mp4'+or+mimeType='video/avi')&key={API_KEY}&fields=files(id,name)"
resp = requests.get(url)
if resp.status_code != 200:
st.error(f"Drive API Error: {resp.text}")
return []
return resp.json().get("files", [])
def download_drive_video(file_id):
download_url = f"https://www.googleapis.com/drive/v3/files/{file_id}?alt=media&key={API_KEY}"
resp = requests.get(download_url, stream=True)
if resp.status_code != 200:
return None
temp = tempfile.NamedTemporaryFile(delete=False, suffix=".mp4")
for chunk in resp.iter_content(chunk_size=8192):
if chunk:
temp.write(chunk)
temp.close()
return temp.name
def process_video(video_path, video_name, log_df):
cap = cv2.VideoCapture(video_path)
frame_num = 0
new_logs = []
detected_this_video = set()
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
if frame_num % FRAME_SKIP == 0:
resized = cv2.resize(frame, (640, 360))
gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
results = reader.readtext(gray)
for (_, text, _) in results:
text = text.replace(" ", "").upper()
if len(text) >= 6 and any(char.isdigit() for char in text):
if text not in detected_this_video:
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
new_logs.append([text, timestamp, video_name])
detected_this_video.add(text)
st.success(f"Detected: {text} at {timestamp}")
frame_num += 1
cap.release()
return new_logs
# Step 1: Download and process videos
files = list_drive_files(FOLDER_ID)
if files:
try:
log_df = pd.read_csv(LOG_FILE)
except pd.errors.EmptyDataError:
log_df = pd.DataFrame(columns=["Vehicle Number", "Timestamp", "Video File"])
all_new_logs = []
for file in files:
st.info(f"Processing: {file['name']}")
local_path = download_drive_video(file['id'])
if local_path:
new_logs = process_video(local_path, file['name'], log_df)
all_new_logs.extend(new_logs)
os.remove(local_path)
if all_new_logs:
pd.DataFrame(all_new_logs, columns=["Vehicle Number", "Timestamp", "Video File"]).to_csv(
LOG_FILE, mode='a', index=False, header=not os.path.exists(LOG_FILE))
st.success("✅ Logs updated.")
else:
st.warning("No video files found or API error.")
# Step 2: Analyze logs
if os.path.exists(LOG_FILE):
try:
df = pd.read_csv(LOG_FILE)
df["Timestamp"] = pd.to_datetime(df["Timestamp"])
entries = df.sort_values("Timestamp").groupby("Vehicle Number").first()
exits = df.sort_values("Timestamp").groupby("Vehicle Number").last()
summary = pd.DataFrame()
summary["Vehicle Number"] = entries.index
summary["Entry Time"] = entries["Timestamp"]
summary["Exit Time"] = exits["Timestamp"]
summary["Duration (minutes)"] = (summary["Exit Time"] - summary["Entry Time"]).dt.total_seconds() / 60
summary["Overstay Alert"] = summary["Duration (minutes)"] > (24 * 60)
summary["Checked Out"] = summary["Entry Time"] != summary["Exit Time"]
st.subheader("📊 Vehicle Summary (Duration in Minutes)")
st.dataframe(summary)
except Exception as e:
st.error(f"Failed to analyze logs: {e}")