import streamlit as st import roboflow import pandas as pd import matplotlib.pyplot as plt import zipfile import tempfile import os import json from shapely.geometry import Polygon from PIL import Image from io import BytesIO from concurrent.futures import ThreadPoolExecutor from google.oauth2 import service_account from googleapiclient.discovery import build from googleapiclient.http import MediaIoBaseUpload import gspread import time st.set_page_config(page_title="Image Segmentation - Roboflow", layout="wide") st.markdown(""" """, unsafe_allow_html=True) # 🔥 Initialize Roboflow API_KEY = "mGkz7QhkhD90YfeiaOxV" rf = roboflow.Roboflow(api_key=API_KEY) project = rf.workspace().project("pre-eclampsia-vhaot") model = project.version("20").model model.confidence = 80 model.overlap = 25 dpi_value = 300 with st.expander("⚙️ Advanced Settings", expanded=True): model.confidence = st.slider("Model Confidence (%)", 20, 100, 80) # 📁 Setup Google Drive and Sheets scope = ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/spreadsheets"] credentials_dict = json.loads(st.secrets["gcp_service_account"]) credentials = service_account.Credentials.from_service_account_info(credentials_dict, scopes=scope) drive_service = build("drive", "v3", credentials=credentials) sheets_client = gspread.authorize(credentials) sheet = sheets_client.open_by_url(st.secrets["feedback_sheet_url"]).sheet1 # 📌 Helper Functions def calculate_polygon_area(points): polygon = Polygon([(p['x'], p['y']) for p in points]) return polygon.area def safe_predict(image_path): for attempt in range(3): try: return model.predict(image_path) except: time.sleep(1) return None def resize_image(image): return image.resize((640, 640)) def upload_to_drive(image_bytes, filename, folder_id): media = MediaIoBaseUpload(image_bytes, mimetype='image/png') drive_service.files().create( body={"name": filename, "parents": [folder_id]}, media_body=media, fields='id' ).execute() def find_or_create_folder(folder_name, parent=None): query = f"name='{folder_name}' and mimeType='application/vnd.google-apps.folder' and trashed=false" if parent: query += f" and '{parent}' in parents" results = drive_service.files().list(q=query, spaces='drive', fields='files(id, name)').execute() folders = results.get('files', []) if folders: return folders[0]['id'] file_metadata = { 'name': folder_name, 'mimeType': 'application/vnd.google-apps.folder' } if parent: file_metadata['parents'] = [parent] file = drive_service.files().create(body=file_metadata, fields='id').execute() return file.get('id')