Spaces:
Runtime error
Runtime error
| import streamlit as st | |
| import numpy as np | |
| import pandas as pd | |
| from PIL import Image | |
| from pages.Functions.Dashboard_functions import add_previous_manual_assessments, delete_last_manual_rating, if_true_rerun, radio_rating_index_translation, set_eval_df_rating_vals, collect_linked_prompt_ratings | |
| from Dashboard_setup import sidebar_information, dashboard_version_code | |
| st.title('Manual assessment') | |
| st.write('On this page you can rate all uploaded images with regards to how good they match their respective prompts. You can see the outcome of your assessment on the summary page.') | |
| st.write(' ') | |
| sidebar_information() | |
| # Create placeholders for key elements | |
| assessment_header = st.empty() | |
| include_subprompts_checkbox = st.empty() | |
| assessment_progress = st.empty() | |
| assessment_progress_bar = st.empty() | |
| ###### Setup of variables ############################ | |
| # Extract how many images are available for manual assessment in entire uploaded dataset | |
| ## Set to zero if the dataset has not been created yet due to starting the app on an assessment page | |
| manual_eval_available = 0 | |
| try: | |
| curr_eval_df = st.session_state['eval_df'] | |
| curr_eval_df['Picture_index']=curr_eval_df.index.values | |
| curr_manual_eval = curr_eval_df.loc[(curr_eval_df['manual_eval']==True)&(curr_eval_df['manual_eval_completed']==False)] | |
| curr_manual_eval_max = len(curr_eval_df.loc[(curr_eval_df['manual_eval']==True)]) | |
| manual_eval_available = len(curr_manual_eval) | |
| curr_prompt_dir = st.session_state['prompt_dir'] | |
| except KeyError: | |
| manual_eval_available = 0 | |
| st.session_state['uploaded_img'] = [] #safety if program is started on manual assesssment page and not desktop | |
| # Create manual rating history if it does not already exist | |
| try: | |
| _ = st.session_state['manual_rating_history'][-1] | |
| except KeyError: | |
| st.session_state['manual_rating_history'] = [] | |
| except IndexError: | |
| pass | |
| ###### Rating loop ############################ | |
| ## If images are available for rating this creates a from to submit ratings to database | |
| ## If subprompt option is selected, it expands the form to include these as well | |
| ## If no images are available it prints situation specific instructions | |
| if manual_eval_available > 0: | |
| assessment_header.subheader('Assess uploaded images') | |
| # Let user choose whether subprompts should be presented | |
| include_subprompts = include_subprompts_checkbox.checkbox('Show related subprompts if available (uploaded subprompts may not be shown if images have been assessed already).', value=True) | |
| # Update the progress statement / bar | |
| assessment_progress.write('{0} images ready / left for assessment.'.format(manual_eval_available)) | |
| assessment_progress_bar.progress(1-manual_eval_available/curr_manual_eval_max) | |
| # Extract first example for manual assessment which is not rated yet (first meaning the lowest index, for lowest prompt number) | |
| ## Also extract relevant metadata of this example | |
| curr_eval_df = st.session_state['eval_df'] | |
| lowest_prompt_no = curr_eval_df.loc[(curr_eval_df['manual_eval']==True)&(curr_eval_df['manual_eval_completed']==False)].Prompt_no.astype('int').min() | |
| curr_picture_index = curr_eval_df.loc[ | |
| (curr_eval_df['manual_eval']==True)& | |
| (curr_eval_df['manual_eval_completed']==False)& | |
| (curr_eval_df['Prompt_no']==str(lowest_prompt_no))].Picture_index.min() | |
| curr_manual_eval_row = curr_eval_df.iloc[[curr_picture_index]] | |
| curr_prompt_ID = int(curr_manual_eval_row.Prompt_no.item()) | |
| curr_prompt_row =st.session_state['prompt_dir'].loc[st.session_state['prompt_dir']['ID']==curr_prompt_ID] | |
| # Extract information about linked subprompts | |
| curr_linked_prompts = curr_prompt_row.Linked_prompts.item() | |
| # Set it to nan if the user chose to hide subprompts in evaluation | |
| if include_subprompts == False: | |
| curr_linked_prompts = float('nan') | |
| # Split the subprompt string to get actual list of subprompt IDs | |
| if pd.notna(curr_linked_prompts): | |
| curr_linked_prompts = curr_linked_prompts.split(',') | |
| # Create form to collect assessment | |
| ## First create main prompt inputs, then render subprompts if subprompt list found | |
| ## The submit button writes assessment to database | |
| form_loc = st.empty() | |
| with form_loc.form("multi_form",clear_on_submit=True): | |
| # Write main prompt | |
| st.write('Prompt: {0}'.format( | |
| curr_prompt_dir.loc[curr_prompt_dir['ID']==int(curr_manual_eval_row.Prompt_no.item())]['Prompt'].item() | |
| )) | |
| # Exclude prompt from rating if user chooses to | |
| exclude_prompt = st.checkbox('Exclude this prompt from manual assessment', value=False) | |
| include_prompt = not exclude_prompt | |
| # Show image of current prompt and rating | |
| st.image(st.session_state['uploaded_img'][curr_manual_eval_row.Picture_index.item()],width=350) | |
| # Preselected radio option | |
| radio_preselect = radio_rating_index_translation(curr_manual_eval_row.manual_eval_task_score.item()) | |
| # Create rating element for main prompt | |
| curr_manual_eval_row['manual_eval_task_score'] = st.radio( | |
| "Does the image match the prompt?",('Yes', 'No'), horizontal=True, key='base', index=radio_preselect) | |
| st.write(' ') # Create whitespace | |
| st.write(' ') # Create whitespace | |
| # Create elements to collect ratings on linked prompts | |
| # This only happens if the current prompt has linked prompts and the user choose to show linked prompts | |
| curr_linked_rows = collect_linked_prompt_ratings(curr_linked_prompts, curr_eval_df, curr_prompt_dir) | |
| # Submit assessments to database | |
| submitted = st.form_submit_button("Submit") | |
| if submitted: | |
| # Create temporary list to hold picture indexes for this run | |
| temp_picture_index_list = [] | |
| # First add main prompt assessment | |
| st.session_state['eval_df'] = set_eval_df_rating_vals( | |
| st.session_state['eval_df'], | |
| picture_index=curr_picture_index, | |
| manual_eval=include_prompt, | |
| manual_eval_completed=True, | |
| manual_eval_task_score=curr_manual_eval_row['manual_eval_task_score'].item() | |
| ) | |
| # Add picture index to temp list | |
| temp_picture_index_list.append(curr_picture_index) | |
| # Add subprompt assessment if dataset was created for subprompts | |
| # This stage will automatically be skipped if the df for linked prompts is empty | |
| for row in curr_linked_rows.itertuples(): | |
| st.session_state['eval_df'] = set_eval_df_rating_vals( | |
| st.session_state['eval_df'], | |
| picture_index=row.Picture_index, | |
| manual_eval=include_prompt, | |
| manual_eval_completed=True, | |
| manual_eval_task_score=row.manual_eval_task_score | |
| ) | |
| # Add picture index to temp list | |
| temp_picture_index_list.append(row.Picture_index) | |
| # Add temp list of picture indices to rating history, if prompt is not excluded | |
| if include_prompt: | |
| st.session_state['manual_rating_history'].append(temp_picture_index_list) | |
| # Reset page after ratings were submitted | |
| st.experimental_rerun() | |
| # Allow user to return to last manual rating | |
| st.session_state['manual_rating_history'],st.session_state['eval_df'], bool_rating_deleted = delete_last_manual_rating( | |
| st.session_state['manual_rating_history'],st.session_state['eval_df']) | |
| if_true_rerun(bool_rating_deleted) | |
| # Allow user to upload past ratings and add them to eval_df | |
| st.session_state['eval_df'], bool_ratings_uploaded = add_previous_manual_assessments(st.session_state['eval_df'],dashboard_version_code=dashboard_version_code) | |
| if_true_rerun(bool_ratings_uploaded) | |
| # If no files are uploaded | |
| elif len(st.session_state['uploaded_img'])==0: | |
| assessment_progress.write('Upload files on dashboard starting page to start manual assessment.') | |
| # If files are uploaded but all ratings are completed | |
| else: | |
| assessment_progress.write('You finished assessing the current batch of uploaded images. Upload more pictures of generate your results on the summary page.') | |
| # Allow user to return to last manual rating | |
| st.session_state['manual_rating_history'],st.session_state['eval_df'], bool_rating_deleted = delete_last_manual_rating( | |
| st.session_state['manual_rating_history'],st.session_state['eval_df']) | |
| if_true_rerun(bool_rating_deleted) | |