Spaces:
Running
Running
import pandas as pd | |
import os | |
from PIL import Image | |
import numpy as np | |
import torch | |
import matplotlib.pyplot as plt | |
from IPython import get_ipython | |
import sys | |
import gc | |
import streamlit as st | |
import logging | |
import functools | |
###### this is used for logging any interaction with the app. ######## | |
###### Logging Decorator ######## | |
log_file = 'my_model/utilities/app.log' | |
# Set up logging | |
logging.basicConfig(filename=log_file, level=logging.DEBUG, format='%(asctime)s - %(message)s') | |
def log_event(event: str) -> None: | |
""" | |
Logs an event with the current timestamp. | |
Args: | |
event (str): The event description to log. | |
""" | |
try: | |
logging.info(event) | |
except Exception as e: | |
logging.error(f"Failed to log event: {e}") | |
def log_function_call(func): | |
""" | |
Decorator that logs the function call details (name and arguments). | |
Args: | |
func (function): The function to be decorated. | |
Returns: | |
function: The wrapped function with logging. | |
""" | |
def wrapper(*args, **kwargs): | |
log_event(f'Function {func.__name__} called with args: {args} and kwargs: {kwargs}') | |
result = func(*args, **kwargs) | |
log_event(f'Function {func.__name__} completed') | |
return result | |
return wrapper | |
##### End of Logging Decorator ##### | |
# Set up logging | |
logging.basicConfig(filename='app.log', level=logging.INFO) | |
def log_click(widget_name): | |
logging.info(f'{widget_name} was clicked.') | |
import csv | |
from datetime import datetime | |
log_file_path = 'app_log.csv' | |
def log_to_csv(event, message): | |
with open(log_file_path, 'a', newline='') as file: | |
writer = csv.writer(file) | |
writer.writerow([datetime.now(), event, message]) | |
######################## | |
def show_image(image): | |
""" | |
Display an image in various environments (Jupyter, PyCharm, Hugging Face Spaces). | |
Handles different types of image inputs (file path, PIL Image, numpy array, OpenCV, PyTorch tensor). | |
Args: | |
image (str or PIL.Image or numpy.ndarray or torch.Tensor): The image to display. | |
""" | |
in_jupyter = is_jupyter_notebook() | |
in_colab = is_google_colab() | |
# Convert image to PIL Image if it's a file path, numpy array, or PyTorch tensor | |
if isinstance(image, str): | |
if os.path.isfile(image): | |
image = Image.open(image) | |
else: | |
raise ValueError("File path provided does not exist.") | |
elif isinstance(image, np.ndarray): | |
if image.ndim == 3 and image.shape[2] in [3, 4]: | |
image = Image.fromarray(image[..., ::-1] if image.shape[2] == 3 else image) | |
else: | |
image = Image.fromarray(image) | |
elif torch.is_tensor(image): | |
image = Image.fromarray(image.permute(1, 2, 0).numpy().astype(np.uint8)) | |
# Display the image | |
if in_jupyter or in_colab: | |
from IPython.display import display | |
display(image) | |
else: | |
image.show() | |
def show_image_with_matplotlib(image): | |
if isinstance(image, str): | |
image = Image.open(image) | |
elif isinstance(image, np.ndarray): | |
image = Image.fromarray(image) | |
elif torch.is_tensor(image): | |
image = Image.fromarray(image.permute(1, 2, 0).numpy().astype(np.uint8)) | |
plt.imshow(image) | |
plt.axis('off') # Turn off axis numbers | |
plt.show() | |
def is_jupyter_notebook(): | |
""" | |
Check if the code is running in a Jupyter notebook. | |
Returns: | |
bool: True if running in a Jupyter notebook, False otherwise. | |
""" | |
try: | |
from IPython import get_ipython | |
if 'IPKernelApp' not in get_ipython().config: | |
return False | |
if 'ipykernel' in str(type(get_ipython())): | |
return True # Running in Jupyter Notebook | |
except (NameError, AttributeError): | |
return False # Not running in Jupyter Notebook | |
return False # Default to False if none of the above conditions are met | |
def is_pycharm(): | |
return 'PYCHARM_HOSTED' in os.environ | |
def is_google_colab(): | |
return 'COLAB_GPU' in os.environ or 'google.colab' in sys.modules | |
def get_image_path(name, path_type): | |
""" | |
Generates a path for models, images, or data based on the specified type. | |
Args: | |
name (str): The name of the model, image, or data folder/file. | |
path_type (str): The type of path needed ('models', 'images', or 'data'). | |
Returns: | |
str: The full path to the specified resource. | |
""" | |
# Get the current working directory (assumed to be inside 'code' folder) | |
current_dir = os.getcwd() | |
# Get the directory one level up (the parent directory) | |
parent_dir = os.path.dirname(current_dir) | |
# Construct the path to the specified folder | |
folder_path = os.path.join(parent_dir, path_type) | |
# Construct the full path to the specific resource | |
full_path = os.path.join(folder_path, name) | |
return full_path | |
def get_model_path(model_name): | |
""" | |
Get the path to the specified model folder. | |
Args: | |
model_name (str): Name of the model folder. | |
Returns: | |
str: Absolute path to the specified model folder. | |
""" | |
# Directory of the current script | |
current_script_dir = os.path.dirname(os.path.abspath(__file__)) | |
# Directory of the 'app' folder (parent of the 'my_model' folder) | |
app_dir = os.path.dirname(os.path.dirname(current_script_dir)) | |
# Path to the 'models/{model_name}' folder | |
model_path = os.path.join(app_dir, "models", model_name) | |
return model_path | |
def free_gpu_resources(): | |
""" | |
Clears GPU memory. | |
""" | |
if torch.cuda.is_available(): | |
torch.cuda.empty_cache() | |
torch.cuda.empty_cache() | |
gc.collect() | |
gc.collect() | |