LoomRAG / data_annotations /data_annotation_page.py
NotShrirang's picture
feat: add app
19a6fbb
import base64
import clip
import io
import json
import os
import pandas as pd
from PIL import Image
import streamlit as st
import sys
import torch
import uuid
from utils import get_local_files
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
def data_annotations():
@st.dialog("Add Annotations", width="large")
def add_annotations_dialog(selected_image):
if not os.path.exists("annotations/"):
os.makedirs("annotations/")
annotation_project_key = st.session_state.get('annotation_project_key', None)
if not annotation_project_key:
annotation_project_key = str(uuid.uuid4())
st.session_state['annotation_project_key'] = annotation_project_key
if not os.path.exists(f"annotations/{annotation_project_key}/"):
os.makedirs(f"annotations/{annotation_project_key}/")
with open(f"annotations/{annotation_project_key}/annotations.json", "w") as f:
json.dump({}, f)
with open(f"annotations/{annotation_project_key}/annotations.json", "r") as f:
annotations_dict: dict = json.load(f)
current_image_annotation = annotations_dict.get(f"images/{selected_image['file_name']}", None)
if not current_image_annotation:
current_image_annotation = ""
st.image(f"images/{selected_image['file_name']}")
annotation = st.text_area("Add Annotations", value=current_image_annotation, height=100, key="annotation_text_area")
if st.button("Add Annotations", key="add_annotations_dialog"):
if annotation.strip() == "" or annotation is None:
st.warning("Please add annotations.")
else:
annotations_dict[f"images/{selected_image['file_name']}"] = annotation
with open(f"annotations/{annotation_project_key}/annotations.json", "w") as f:
json.dump(annotations_dict, f, indent=4)
st.toast("Annotations added successfully.", icon="πŸŽ‰")
st.rerun()
st.title("Data Annotations")
files = get_local_files("images/", extensions=["jpg", "jpeg", "png"], get_details=True)
if not files:
st.warning("No images found in the data directory.")
return
st.write(f"Total {len(files)} images found in the data directory.")
files_df = pd.DataFrame(files)
files_df['Image'] = files_df['file_name'].apply(lambda x: f"data:image/{x.split('.')[-1]};base64,{base64.b64encode(open(f'images/{x}', 'rb').read()).decode()}")
files_df = files_df[["Image", "file_name", "file_size", "file_created"]]
if "annotation_project_key" in st.session_state:
annotation_project_key = st.session_state['annotation_project_key']
if os.path.exists(f"annotations/{annotation_project_key}/annotations.json"):
with open(f"annotations/{annotation_project_key}/annotations.json", "r") as f:
annotations_dict: dict = json.load(f)
files_df["Annotation"] = files_df["file_name"].apply(lambda x: annotations_dict.get(f"images/{x}", ""))
event = st.dataframe(files_df, hide_index=True, use_container_width=True, column_config={"Image" : st.column_config.ImageColumn('Image', pinned=True)}, selection_mode="single-row", on_select='rerun', key="image_table")
if len(event.selection['rows']):
selected_image = files[event.selection['rows'][0]]
add_annotations_dialog(selected_image)