-
Notifications
You must be signed in to change notification settings - Fork 0
/
PhaseVoting.py
149 lines (123 loc) · 5.39 KB
/
PhaseVoting.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 11 21:11:44 2023
@author: Brent Visser
"""
import streamlit as st
import pandas as pd
import random
import gspread
from PIL import Image
import requests
from io import BytesIO
from datetime import datetime
import time
def check_password():
"""Returns `True` if the user had the correct password."""
def password_entered():
"""Checks whether a password entered by the user is correct."""
if st.session_state["password"] == st.secrets["password"]:
st.session_state["password_correct"] = True
del st.session_state["password"] # don't store password
else:
st.session_state["password_correct"] = False
if "password_correct" not in st.session_state:
# First run, show input for password.
st.text_input(
"Password", type="password", on_change=password_entered, key="password"
)
return False
elif not st.session_state["password_correct"]:
# Password not correct, show input + error.
st.text_input(
"Password", type="password", on_change=password_entered, key="password"
)
st.error("😕 Password incorrect")
return False
else:
# Password correct.
return True
if check_password():
@st.cache_resource
def google_connect():
credentials = st.secrets["credentials"]
scopes = [
'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive'
]
gc = gspread.service_account_from_dict(credentials)
spreadsheet_key = st.secrets["urlkey"]
return gc, spreadsheet_key
gc, spreadsheet_key = google_connect()
@st.cache_resource
def read_images(IMAGE_LIST_PATH): # read list of images present
with open(IMAGE_LIST_PATH, 'r') as f:
image_list = f.read().split("\n")
base_url = st.secrets["base_url"]
return image_list, base_url
IMAGE_LIST_PATH = r'./file_list.txt'
image_list, base_url = read_images(IMAGE_LIST_PATH)
# Initialize session state numbers
if 'numbers' not in st.session_state:
st.session_state.numbers = []
if not st.session_state.numbers:
st.session_state.numbers = image_list
random.shuffle(st.session_state.numbers)
if len(st.session_state.numbers) == 0:
st.write('No more images, clear cache to load all images again')
if st.button("Clear cache", key = "Cache"):
st.cache_resource.clear()
st.experimental_rerun()
else:
selected_number = st.session_state.numbers[0]
# Define the function to load the data from the Drive sheet
@st.cache_resource
def load_data():
worksheet = gc.open_by_key(spreadsheet_key).get_worksheet(0)
dataframe = pd.DataFrame(worksheet.get_all_records())
return dataframe, worksheet
# Define the function to save the data to the CSV file
def save_data(worksheet, df):
counted = 0
done = False
while done == False and counted < 10:
try:
worksheet.update([df.columns.values.tolist()] + df.values.tolist())
st.session_state.numbers.pop(0)
new_image()
done = True
except Exception as e:
time.sleep(0.5)
print(e)
counted+=1
# Define the main Streamlit app
st.title('Image Classification')
# Choose a number to remove
def new_image():
with st.spinner('Saving & Loading next image...'):
IMAGE_URL = f'{base_url}{st.session_state.numbers[0]}'
IMAGE_URL = IMAGE_URL.replace('%', '').replace('(', '').replace(')', '')
st.image(IMAGE_URL, width = 512)
# Load the data from the CSV file
data, worksheet = load_data()
if st.button("Click here to get your first image", key="start"):
save_data(worksheet, data)
# Create 5 columns for the buttons
col1, col2, col3, col4, col5 = st.columns(5)
# Show the buttons for the user to answer
if col1.button('Coacervate', key="Coacervate"):
data.loc[len(data)] = [st.session_state.numbers[0], 'coacervate', datetime.now().strftime('%Y-%m-%d %H:%M:%S')]
save_data(worksheet, data)
if col2.button('Solution', key="Solution"):
data.loc[len(data)] = [st.session_state.numbers[0], 'solution', datetime.now().strftime('%Y-%m-%d %H:%M:%S')]
save_data(worksheet, data)
if col3.button('Aggregate', key="Aggregate"):
data.loc[len(data)] = [st.session_state.numbers[0], 'Aggregate', datetime.now().strftime('%Y-%m-%d %H:%M:%S')]
save_data(worksheet, data)
if col4.button('Gel', key="Gel"):
data.loc[len(data)] = [st.session_state.numbers[0], 'gel', datetime.now().strftime('%Y-%m-%d %H:%M:%S')]
save_data(worksheet, data)
if col4.button('Skip', key="Skip"):
data.loc[len(data)] = [st.session_state.numbers[0], 'Skip', datetime.now().strftime('%Y-%m-%d %H:%M:%S')]
save_data(worksheet, data)
st.write(f'{len(st.session_state.numbers)} images in session (no, you don\'t have to answer them all :) )')