Spaces:
Sleeping
Sleeping
import pandas as pd | |
import seaborn as sns | |
import matplotlib.pyplot as plt | |
import streamlit as st | |
plt.style.use('dark_background') | |
plt.rcParams.update({'figure.figsize': (7, 1.5)}) | |
plt.rcParams.update({'font.size': 5}) | |
def draw_plots(df: pd.DataFrame) -> None: | |
df_clean = df.dropna(subset=['face_conf']) | |
st.write('---') | |
st.write('Количество детекций по возрасту и по уверенности модели') | |
fig, axes = plt.subplots(1, 2) | |
sns.histplot(df_clean['age'], kde=True, ax=axes[0]) | |
axes[0].set_title('Распределение возраста') | |
axes[0].set_xlabel('Возраст') | |
axes[0].set_ylabel('Количество обнаружений') | |
sns.histplot(df_clean['face_conf'], kde=True, ax=axes[1]) | |
axes[1].set_title('Распределение уверенности детекций') | |
axes[1].set_xlabel('Уверенность') | |
axes[1].set_ylabel('Количество обнаружений') | |
st.pyplot(fig, use_container_width=False) | |
st.write('---') | |
st.write('Распределение уверенности модели по классам пола и эмоций') | |
fig, axes = plt.subplots(1, 2) | |
sns.boxplot( | |
data=df_clean, | |
x='gender', | |
y='face_conf', | |
hue='gender', | |
palette='hls', | |
ax=axes[0], | |
) | |
axes[0].set_title('Распределение уверенности детекций по полу') | |
axes[0].set_xlabel('Пол') | |
axes[0].set_ylabel('Уверенность') | |
# axes[0].tick_params(axis='x', labelrotation=45) | |
sns.boxplot( | |
data=df_clean, | |
x='emotion', | |
y='face_conf', | |
hue='emotion', | |
palette='hls', | |
ax=axes[1], | |
) | |
axes[1].set_title('Распределение уверенности детекций по эмоциям') | |
axes[1].set_xlabel('Эмоция') | |
axes[1].set_ylabel('Уверенность') | |
st.pyplot(fig, use_container_width=False) | |
st.write('---') | |
st.write('Количество детекций по классам эмоций и пола') | |
fig, axes = plt.subplots(1, 2) | |
sns.countplot( | |
data=df_clean, | |
x='emotion', | |
hue='emotion', | |
order=df_clean['emotion'].value_counts().index, | |
palette='viridis', | |
legend=False, | |
ax=axes[0], | |
) | |
axes[0].set_title('Количество обнаружений эмоций') | |
axes[0].set_xlabel('Эмоция') | |
axes[0].set_ylabel('Количество') | |
sns.countplot( | |
data=df_clean, | |
x='gender', | |
hue='gender', | |
order=df_clean['gender'].value_counts().index, | |
palette='Set2', | |
legend=False, | |
ax=axes[1], | |
) | |
axes[1].set_title('Количество обнаружений пола') | |
axes[1].set_xlabel('Пол') | |
axes[1].set_ylabel('Количество') | |
st.pyplot(fig, use_container_width=False) | |
st.write('---') | |
st.write('Количество детекций по классу эмоций в зависимости от пола и расы') | |
fig, axes = plt.subplots(1, 2) | |
sns.countplot( | |
data=df_clean, | |
x='emotion', | |
hue='gender', | |
palette='viridis', | |
order=df_clean['emotion'].value_counts().index, | |
ax=axes[0], | |
) | |
axes[0].set_title('Распределение пола по эмоциям') | |
axes[0].set_xlabel('Эмоция') | |
axes[0].set_ylabel('Количество') | |
axes[0].legend(title='Пол') | |
sns.countplot( | |
data=df_clean, | |
x='emotion', | |
hue='race', | |
palette='viridis', | |
order=df_clean['emotion'].value_counts().index, | |
ax=axes[1], | |
) | |
axes[1].set_title('Распределение рас по эмоциям') | |
axes[1].set_xlabel('Эмоция') | |
axes[1].set_ylabel('Количество') | |
axes[1].legend(title='Раса') | |
st.pyplot(fig, use_container_width=False) | |
st.write('---') | |
st.write('Кадры и секунды с наибольшим количеством детекций') | |
fig, axes = plt.subplots(1, 2) | |
face_count_per_frame = df.groupby('frame_num')['face_detected'].sum() | |
axes[0].plot(face_count_per_frame.index, face_count_per_frame.values, marker='o', linestyle='-') | |
axes[0].set_title('Частота обнаружения лиц по кадрам') | |
axes[0].set_xlabel('Номер кадра') | |
axes[0].set_ylabel('Количество обнаруженных лиц') | |
face_count_per_frame = df.groupby('frame_sec')['face_detected'].sum() | |
axes[1].plot(face_count_per_frame.index, face_count_per_frame.values, marker='o', linestyle='-') | |
axes[1].set_title('Частота обнаружения лиц по секундам') | |
axes[1].set_xlabel('Время (сек)') | |
axes[1].set_ylabel('Количество обнаруженных лиц') | |
st.pyplot(fig, use_container_width=False) | |
st.write('---') | |
st.write('Какие классы в какое время были обнаружены (по эмоциям)') | |
fig, ax = plt.subplots(1, 1) | |
sns.scatterplot( | |
data=df_clean, | |
x='frame_sec', | |
y='emotion', | |
hue='emotion', | |
palette='deep', | |
s=50, | |
alpha=0.6, | |
legend=True, | |
ax=ax, | |
) | |
ax.set_title('Временная шкала обнаружения лиц по эмоциям') | |
ax.set_xlabel('Время видео (секунды)') | |
ax.set_ylabel('Эмоция') | |
ax.grid(True, linestyle='--', alpha=0.7) | |
ax.legend(title='Классы эмоций', bbox_to_anchor=(1.05, 1), loc='upper left') | |
st.pyplot(fig, use_container_width=False) | |
st.write('---') | |
st.write('Какие классы в какое время были обнаружены (по полу)') | |
fig, ax = plt.subplots() | |
sns.scatterplot( | |
data=df_clean, | |
x='frame_sec', | |
y='gender', | |
hue='gender', | |
palette='deep', | |
s=50, | |
alpha=0.6, | |
legend=True, | |
ax=ax, | |
) | |
ax.set_title('Временная шкала обнаружения лиц по полу') | |
ax.set_xlabel('Время видео (секунды)') | |
ax.set_ylabel('Пол') | |
ax.grid(True, linestyle='--', alpha=0.7) | |
ax.legend(title='Классы пола', bbox_to_anchor=(1.05, 1), loc='upper left') | |
st.pyplot(fig, use_container_width=False) | |
st.write('---') | |
st.write('Какие классы в какое время были обнаружены (по расе)') | |
fig, ax = plt.subplots() | |
sns.scatterplot( | |
data=df_clean, | |
x='frame_sec', | |
y='race', | |
hue='race', | |
palette='deep', | |
s=50, | |
alpha=0.6, | |
legend=True, | |
ax=ax, | |
) | |
ax.set_title('Временная шкала обнаружения лиц по расе') | |
ax.set_xlabel('Время видео (секунды)') | |
ax.set_ylabel('Раса') | |
ax.grid(True, linestyle='--', alpha=0.7) | |
ax.legend(title='Классы расы', bbox_to_anchor=(1.05, 1), loc='upper left') | |
st.pyplot(fig, use_container_width=False) | |
st.write('---') | |
st.write('Распределение смены эмоций по времени и кол-ву детекций') | |
fig, ax = plt.subplots() | |
emotion_timeline = df.pivot_table( | |
index='frame_sec', | |
columns='emotion', | |
aggfunc='size', | |
fill_value=0, | |
) | |
emotion_timeline.plot(kind='area', stacked=True, ax=ax) | |
ax.set_title('Изменение эмоций во времени') | |
ax.set_xlabel('Время видео (секунды)') | |
ax.set_ylabel('Количество детекций') | |
ax.grid(True, linestyle='--', alpha=0.7) | |
ax.legend(title='Эмоции', bbox_to_anchor=(1.05, 1), loc='upper left') | |
st.pyplot(fig, use_container_width=False) | |
st.write('---') | |