Spaces:
Sleeping
Sleeping
import streamlit as st | |
import pandas as pd | |
import matplotlib.pyplot as plt | |
import requests | |
import io | |
#import streamlit as st | |
#import pandas as pd | |
#import matplotlib.pyplot as plt | |
st.title('Playing cards Image Analysis') | |
#sample slider; feel free to remove: | |
#x = st.slider('Select a value') | |
#st.write(x, 'squared is', x * x) | |
''' | |
This next piece of code will hit GitHub for two csv files | |
One is the original dataset, broken up into test, train, valid. | |
The second csv is the test dataset, with the results after the models were run through the API | |
''' | |
# Downloading the csv file from your GitHub account | |
url = "https://huggingface.co/datasets/rwcuffney/autotrain-data-pick_a_card/raw/main/cards.csv" | |
download = requests.get(url).content | |
# Reading the downloaded content and turning it into a pandas data frame | |
df = pd.read_csv(io.StringIO(download.decode('utf-8'))) | |
#df = pd.read_csv('playing_cards/cards.csv').sort_values('class index') | |
df_fulldataset=df | |
# Downloading the csv file from your GitHub account | |
url = "https://huggingface.co/datasets/rwcuffney/autotrain-data-pick_a_card/raw/main/ML_results.csv" | |
download = requests.get(url).content | |
# Reading the downloaded content and turning it into a pandas data frame | |
df = pd.read_csv(io.StringIO(download.decode('utf-8'))) | |
#df = pd.read_csv('playing_cards/cards.csv').sort_values('class index') | |
df_test = df | |
# Create the button | |
if st.button('Click me to re-run code',key='RunCode_button'): | |
# Call the function when the button is clicked | |
st.experimental_rerun() | |
st.header('Sample of the .csv data:') | |
x = st.slider('Select a value',value=10,max_value=8000) | |
st.table(df_fulldataset.sample(x)) | |
### HORIZONTAL BAR ### | |
st.header('Distribution of the playing card images:') | |
# Get the value counts of the 'labels' column | |
value_counts = df_fulldataset.groupby('labels')['class index'].count().iloc[::-1] | |
fig, ax = plt.subplots(figsize=(10,10)) | |
# Create a bar chart of the value counts | |
ax = value_counts.plot.barh() | |
# Set the chart title and axis labels | |
ax.set_title('Value Counts of Labels') | |
ax.set_xlabel('Label') | |
ax.set_ylabel('Count') | |
# Show the chart | |
st.pyplot(fig) | |
### PIE CHART ### | |
st.header('Balance of Train,Valid,Test datasets:') | |
# Get the value counts of the 'labels' column | |
value_counts = df_fulldataset.groupby('data set')['class index'].count().iloc[::-1] | |
value_counts =df_fulldataset['data set'].value_counts() | |
fig, ax = plt.subplots(figsize=(5,5) | |
) | |
# Create a bar chart of the value counts | |
ax = value_counts.plot.pie(autopct='%1.1f%%') | |
# Set the chart title and axis labels | |
# Show the chart | |
st.pyplot(fig) | |
models_run= ['SwinForImageClassification_24', | |
'ViTForImageClassification_22', | |
'SwinForImageClassification_21', | |
'ResNetForImageClassification_23', | |
'BeitForImageClassification_25'] | |
from enum import Enum | |
API_dict = dict( | |
SwinForImageClassification_21="https://api-inference.huggingface.co/models/rwcuffney/autotrain-pick_a_card-3726099221", | |
ViTForImageClassification_22="https://api-inference.huggingface.co/models/rwcuffney/autotrain-pick_a_card-3726099222", | |
ResNetForImageClassification_23= "https://api-inference.huggingface.co/models/rwcuffney/autotrain-pick_a_card-3726099223", | |
SwinForImageClassification_24 = "https://api-inference.huggingface.co/models/rwcuffney/autotrain-pick_a_card-3726099224", | |
BeitForImageClassification_25="https://api-inference.huggingface.co/models/rwcuffney/autotrain-pick_a_card-3726099225") | |
# printing enum member as string | |
#print(Api_URL.ViTForImageClassification_22.value) | |
####Try it out ### | |
import requests | |
st.header("Try it out") | |
''' | |
Warning: it will error out at first, resubmit a few times. | |
Each model needs to 'warm up' before they start working. | |
You can use any image... try test/queen of hearts/4.jpg to see an example that | |
Got different results with different models | |
''' | |
headers = {"Authorization": "Bearer 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"} | |
def query(filename,api_url): | |
#with open(filename, "rb") as f: | |
#data = f.read() | |
response = requests.post(api_url, headers=headers, data=filename) | |
return response.json() | |
#API_URL = "https://api-inference.huggingface.co/models/rwcuffney/autotrain-pick_a_card-3726099224" | |
##### FORM ##### | |
with st.form("api_form"): | |
api = st.selectbox('Which model do you want to try?',models_run,key='select_box') | |
uploaded_file = st.file_uploader("Choose a file") | |
if uploaded_file is not None: | |
# To read file as bytes: | |
bytes_data = uploaded_file.getvalue() | |
#st.write(bytes_data) | |
st.image(uploaded_file) | |
submitted = st.form_submit_button("Submit") | |
if submitted: | |
st.write(API_dict[api]) | |
output = query(bytes_data,API_dict[api]) | |
prediction = output[0]['label'] | |
st.write(f'prediction = {prediction}') | |
st.text(output) | |
#### FUNCTIONS #### | |
import sklearn | |
from sklearn import metrics | |
import matplotlib.pyplot as plt | |
index = ['accuracy_score','Weighted f1', 'Cohen Kappa','Matthews'] | |
df_Metrics =pd.DataFrame(index=index) | |
labels = df_test['labels'].unique() | |
### FUNCTION TO SHOW THE METRICS | |
def show_metrics(test,pred,name): | |
from sklearn import metrics | |
my_Name = name | |
my_Accuracy_score=metrics.accuracy_score(test, pred) | |
#my_ROC_AUC_score= roc_auc_score(y, model.predict_proba(X), multi_class='ovr') | |
my_Weighted_f1= metrics.f1_score(test, pred,average='weighted') | |
my_Cohen_Kappa = metrics.cohen_kappa_score(test, pred) | |
my_Matthews_coefficient=metrics.matthews_corrcoef(test, pred) | |
st.header(f'Metrics for {my_Name}:') | |
report =metrics.classification_report(test, pred, output_dict=True) | |
df_report = pd.DataFrame(report).transpose() | |
st.dataframe(df_report ) | |
st.write(f'Accuracy Score........{metrics.accuracy_score(test, pred):.4f}\n\n' \ | |
#f'ROC AUC Score.........{my_ROC_AUC_score:.4f}\n\n' \ | |
f'Weighted f1 score.....{my_Weighted_f1:.4f}\n\n' \ | |
f'Cohen Kappa...........{my_Cohen_Kappa:.4f}\n\n' \ | |
f'Matthews Coefficient..{my_Matthews_coefficient:.4f}\n\n') | |
my_List = [my_Accuracy_score, my_Weighted_f1, my_Cohen_Kappa, my_Matthews_coefficient] | |
df_Metrics[my_Name] = my_List | |
cfm= metrics.confusion_matrix(test, pred) | |
st.caption(f'Confusion Matrix: {my_Name}') | |
cmd = metrics.ConfusionMatrixDisplay(cfm,display_labels=labels) | |
fig, ax = plt.subplots(figsize=(15,15)) | |
ax = cmd.plot(ax=ax, | |
colorbar=False, | |
values_format = '.0f', | |
cmap='Reds')#='tab20')# see color options here https://matplotlib.org/stable/tutorials/colors/colormaps.html | |
plt.xticks(rotation=90) | |
st.pyplot(fig) | |
st.header('Let\'s see how the models performed') | |
''' | |
The next part of the code will analyze the full dataset. | |
Choose all five models to compare them all | |
''' | |
##### FORM ##### | |
with st.form("my_form"): | |
st.write("You can choose from 1 to 5 models") | |
selected_options = st.multiselect( | |
'Which models would you like to analyze?', models_run) | |
submitted = st.form_submit_button("Submit") | |
if submitted: | |
st.write('you selected',selected_options) | |
###Show the metrics for each dataset: | |
test = df_test['labels'] | |
#for m in models_run: | |
for m in selected_options: | |
pred = df_test[m] | |
show_metrics(test,pred,m) | |
st.header('Metrics for all models:') | |
st.table(df_Metrics) | |
#### GRAPH THE RESULTS ### | |
import seaborn as sns | |
# Reshape the dataframe into long format using pd.melt() | |
#subset_df = pd.melt(df_Metrics[['SwinForImageClassification_24', | |
#'ViTForImageClassification_22', 'SwinForImageClassification_21', 'ResNetForImageClassification_23', 'BeitForImageClassification_25']].reset_index(), id_vars='index', var_name='Model', value_name='Score') | |
subset_df = pd.melt(df_Metrics[selected_options].reset_index(), id_vars='index', var_name='Model', value_name='Score') | |
sns.set_style('whitegrid') | |
ax=sns.catplot(data=subset_df, | |
x='index', | |
y='Score', | |
hue='Model', | |
kind='bar', | |
palette='Blues', | |
aspect=2) | |
plt.xlabel('Clusters') | |
plt.ylabel('Scores') | |
fig = ax.figure | |
st.pyplot(fig) | |