| 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(""" |
| <style> |
| .main { |
| background-color: #ffffff; |
| color: #002b55; |
| } |
| .stButton > button { |
| background-color: #004080; |
| color: white; |
| border: none; |
| padding: 0.5em 1em; |
| border-radius: 5px; |
| } |
| .stButton > button:hover { |
| background-color: #0059b3; |
| color: white; |
| } |
| </style> |
| """, unsafe_allow_html=True) |
|
|
| |
| 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) |
|
|
| |
| 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 |
|
|
| |
|
|
| 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') |