import altair as alt import numpy as np import pandas as pd import streamlit as st #== import uuid from pathlib import Path from huggingface_hub import CommitScheduler import json #from huggingface_hub import login from huggingface_hub import whoami import os #== import datetime user = whoami(token=os.environ.get("HF_TOKEN")) #== #st.set_page_config(layout="wide") #=== #login() ## Define the file where to save the data. Use UUID to make sure not to overwrite existing data from a previous run. #feedback_file = Path("PedroC11/data_pref/") / f"data_{uuid.uuid4()}.json" #feedback_folder = feedback_file.parent feedback_folder = Path("data_JSON") feedback_folder.mkdir(parents=True, exist_ok=True) #####feedback_file = feedback_folder / f"data_{uuid.uuid4()}.json" # Schedule regular uploads. Remote repo and local folder are created if they don't already exist. scheduler = CommitScheduler( repo_id="data_pref", repo_type="dataset", folder_path=feedback_folder, path_in_repo="data_p", #every=10, ) # Define the function that will be called when the user submits its feedback (to be called in Gradio) #def save_feedback(input_text:str, output_1: str, output_2:str, user_choice: int) -> None: # """ # Append input/outputs and user feedback to a JSON Lines file using a thread lock to avoid concurrent writes from different users. # """ # with scheduler.lock: # with feedback_file.open("a") as f: # f.write(json.dumps({"input": input_text, "output_1": output_1, "output_2": output_2, "user_choice": user_choice})) # f.write("\n") #==== if 'cont_r' not in st.session_state: st.session_state.cont_r = 0 # ---- CONFIG ---- st.set_page_config(page_title="Image Preference Study", layout="centered") st.title("Image Preference Study") st.header("Instructions", divider=True) #st.markdown(f"**Instructions:** st.markdown(f"You will be shown 25 pairs of images. For each pair, please select which image \"Option A\" (left) or \"Option B\" (right) you think is \ **more visually appealing** and has a **better quality** (for example, *sharp edges*, *clear object details/shapes/proportions*, etc.) , regardless of the picture subject content.") st.markdown(f"Please, evaluate each pair of images **independently** of the other pairs.") st.markdown(f"If needed, please, look closer to the screen and/or zoom in the pictures.") st.markdown(f"*Example: If Option A depicts a gray bunny and is a better quality picture than Option B which depicts a brown bunny, I would choose Option A despite \ the fact that I personally *like* brown bunnies more than gray bunnies.*") st.header("Images", divider=True) # ---- IMAGE PAIRS ---- # Replace with your actual image paths or URLs image_pairs = [ ("images/A_0.jpeg", "images/B_0.jpeg"), ("images/A_1.jpeg", "images/B_1.jpeg"), ("images/A_2.jpeg", "images/B_2.jpeg"), ("images/A_3.jpeg", "images/B_3.jpeg"), ("images/A_4.jpeg", "images/B_4.jpeg"), ("images/A_5.jpeg", "images/B_5.jpeg"), ("images/A_6.jpeg", "images/B_6.jpeg"), ("images/A_7.jpeg", "images/B_7.jpeg"), ("images/A_8.jpeg", "images/B_8.jpeg"), ("images/A_9.jpeg", "images/B_9.jpeg"), ("images/A_10.jpeg", "images/B_10.jpeg"), ("images/A_11.jpeg", "images/B_11.jpeg"), ("images/A_12.jpeg", "images/B_12.jpeg"), ("images/A_13.jpeg", "images/B_13.jpeg"), ("images/A_14.jpeg", "images/B_14.jpeg"), ("images/A_15.jpeg", "images/B_15.jpeg"), ("images/A_16.jpeg", "images/B_16.jpeg"), ("images/A_17.jpeg", "images/B_17.jpeg"), ("images/A_18.jpeg", "images/B_18.jpeg"), ("images/A_19.jpeg", "images/B_19.jpeg"), ("images/A_20.jpeg", "images/B_20.jpeg"), ("images/A_21.jpeg", "images/B_21.jpeg"), ("images/A_22.jpeg", "images/B_22.jpeg"), ("images/A_23.jpeg", "images/B_23.jpeg"), ("images/A_24.jpeg", "images/B_24.jpeg") ] results = {} code_prov = st.text_input("Type the provided code in the box below:") # ---- LOOP THROUGH PAIRS ---- for i, (imgA, imgB) in enumerate(image_pairs): st.markdown(f"### Pair {i+1}") col1, col2 = st.columns(2) with col1: st.image(imgA, caption="Option A", use_container_width=True) with col2: st.image(imgB, caption="Option B", use_container_width=True) choice = st.radio( f"Which image do you prefer for Pair {i+1}?", ("-","Option A (left)", "Option B (right)"), key=f"choice_{i}" ) results[f"pair_{i+1}"] = choice # ---- SUBMIT ---- if st.button("Submit"): cont = 0 for key in results: if results[key] == "-": cont += 1 if code_prov == "": st.error("Please, insert your provided code at the beginning of this form. Then, try submitting again.") elif cont != 0: st.error("It seems you have not evaluated all pairs. Please, check again and Submit. Click on Submit again if you think there is error.") else: if st.session_state.cont_r == 0: st.session_state.cont_r += 1 #st.success("Thank you! Your responses have been recorded.") #st.write("Thank you! Your selection has been recorded.") st.success("Thank you! Your selection has been recorded.") #st.write("Your final selection is in the green box below. Please, copy them and send them to my email. Thanks a lot!") #s_rp = "SELECTION: " #for i in range(len(image_pairs)): # if i == (len(image_pairs) - 1): # s_rp = s_rp + results[f"pair_{i+1}"] + "." # else: # s_rp = s_rp + results[f"pair_{i+1}"] + ", " ##st.badge(s_rp, width = "stretch") #st.success(s_rp) # st.json(results) #==== current_time = datetime.datetime.now() results["day"] = str(current_time.day) results["time"] = str(current_time.hour) + ":" + str(current_time.minute) + ":" + str(current_time.second) results["code"] = code_prov results["page"] = "Im_1" with scheduler.lock: feedback_file = feedback_folder / f"data_{uuid.uuid4()}_{results["code"]}.json" with feedback_file.open("a") as f: f.write(json.dumps(results)) f.write("\n") #==== else: st.success("Thanks. Only one submission is allowed.") # Save to file (you could also save to a database) #with open("resp/responses.txt", "a") as f: # f.write(str(results) + "\n")