Spaces:
Sleeping
Sleeping
| import os | |
| import streamlit as st | |
| import pandas as pd | |
| import huggingface_hub as hfh | |
| import requests | |
| import time | |
| import uuid | |
| def get_uuid(): | |
| return str(uuid.uuid4())[:6] | |
| os.makedirs("labels", exist_ok=True) | |
| voters = [ | |
| "osman", | |
| "eren", | |
| "robin", | |
| "mira", | |
| "bilal", | |
| "volunteer-1", | |
| "volunteer-2", | |
| "volunteer-3", | |
| "volunteer-4", | |
| "volunteer-5", | |
| ] | |
| api = hfh.HfApi(token=os.environ.get("hf_token")) | |
| def get_list_of_images(): | |
| files = api.list_repo_tree(repo_id="aifred-smart-life-coach/capstone-images", repo_type="dataset", recursive=True,) | |
| files = [file.path for file in files if file.path.endswith((".png", ".jpg"))] | |
| return files | |
| def get_one_from_queue(voter: str): | |
| # get an image for the voter or return False if no image is left | |
| # aifred-smart-life-coach/labels labels dataset | |
| # labels dataset multiple csv files named as [voter name].csv | |
| # each csv file has the image image path vote date, votes | |
| url = f"https://huggingface.co/datasets/aifred-smart-life-coach/labels/raw/main/{voter}.csv" | |
| # fetch file and save it to the labels folder | |
| file_path = f"labels/{voter}.csv" | |
| req = requests.get(url) | |
| with open(file_path, "wb") as file: | |
| file.write(req.content) | |
| df = pd.read_csv(file_path) | |
| print(df) | |
| num_past_votes = df.shape[0] | |
| print("num_past_votes", num_past_votes) | |
| list_of_images = get_list_of_images() | |
| print("list_of_images", len(list_of_images)) | |
| st.write(f"You have voted for {num_past_votes} images out of {len(list_of_images)} images") | |
| # get the list of images that are not present in the csv file | |
| images_not_voted = list(set(list_of_images) - set(df["image_path"].tolist())) | |
| print("images_not_voted", len(images_not_voted)) | |
| return images_not_voted[0] if images_not_voted else False | |
| def update_vote( | |
| voter: str, | |
| image: str, | |
| gender: str, | |
| healthiness: int, | |
| fat_level: int, | |
| muscle_level: int, | |
| uuid_num: str, | |
| ): | |
| url = f"https://huggingface.co/datasets/aifred-smart-life-coach/labels/raw/main/{voter}.csv" | |
| # fetch file and save it to the labels folder | |
| file_path = f"labels/{voter}.csv" | |
| req = requests.get(url) | |
| # delete the file if it exists | |
| if os.path.exists(file_path): | |
| os.remove(file_path) | |
| with open(file_path, "wb") as file: | |
| file.write(req.content) | |
| df = pd.read_csv(file_path) | |
| print(df) | |
| # if the df has the image path of the image, raise an error | |
| if image in df["image_path"].tolist(): | |
| st.error("You have already voted for this image") | |
| st.stop() | |
| new_row = pd.DataFrame( | |
| { | |
| "image_path": [image], | |
| "gender": [ gender ], | |
| "health": [healthiness], | |
| "fat_level": [fat_level], | |
| "muscle_level": [muscle_level], | |
| "vote_date": [int(time.time())], | |
| "voter_name": [voter], | |
| "uuid": [uuid_num], | |
| } | |
| ) | |
| df = pd.concat([df, new_row], ignore_index=True) | |
| df.to_csv(file_path, index=False) | |
| # push the file to the dataset | |
| api.upload_file( | |
| path_or_fileobj=file_path, | |
| path_in_repo=f"{voter}.csv", | |
| repo_id="aifred-smart-life-coach/labels", repo_type="dataset", | |
| commit_message=f"{voter} voted for {image}" | |
| ) | |
| if 'loggedin' not in st.session_state: # user is not logged in | |
| with st.form("login"): | |
| username = st.selectbox("Select voter", voters) | |
| password = st.text_input("Password (get password from contact@osbm.dev)", type="password") | |
| submitted = st.form_submit_button("Login") | |
| if submitted: # submitted password | |
| if not password == os.environ.get("app_password"): # password is incorrect | |
| st.error("The password you entered is incorrect") | |
| st.stop() | |
| else: # password is correct | |
| st.success("Welcome, " + username) | |
| st.write("You are now logged in") | |
| st.session_state['loggedin'] = username | |
| st.rerun() | |
| else: # logged in | |
| username = st.session_state['loggedin'] | |
| st.success(f"Welcome, {username}") | |
| image_path = get_one_from_queue(username) | |
| with st.form("images", clear_on_submit=True): | |
| col1, col2= st.columns(2) | |
| with col1: | |
| if not image_path: | |
| st.write("You have voted for all the images") | |
| st.stop() | |
| path = hfh.hf_hub_download( | |
| repo_id="aifred-smart-life-coach/capstone-images", | |
| repo_type="dataset", | |
| filename=image_path, | |
| token=os.environ.get("hf_token") | |
| ) | |
| st.image(path, width=300) | |
| with col2: | |
| st.write(image_path) | |
| gender = st.radio("Gender", [ | |
| "Male", | |
| "Female", | |
| "Non-defining", | |
| ]) | |
| healthiness = st.slider("How healthy is this picture?", 0, 100, 50) | |
| fat_level = st.slider("How fat is this picture?", 0, 100, 50) | |
| muscle_level = st.slider("How muscular is this picture?", 0, 100, 50) | |
| uuid_num = get_uuid() | |
| submitted_second = st.form_submit_button("Submit") | |
| if submitted_second: | |
| update_vote( | |
| voter=username, | |
| image=image_path, | |
| gender=gender, | |
| healthiness=healthiness, | |
| fat_level=fat_level, | |
| muscle_level=muscle_level, | |
| uuid_num=uuid_num, | |
| ) | |
| st.success(f"Vote submitted uuid: {uuid_num} for the image: {image_path} (in case you want to undo the vote)") | |
| with st.spinner("Wait for the upload of the vote", show_time=True): | |
| time.sleep(1) | |
| st.rerun() | |