Spaces:
Sleeping
Sleeping
# import os | |
# os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0' | |
# import streamlit as st | |
# import cv2 | |
# from tqdm import tqdm | |
# import numpy as np | |
# import tensorflow as tf | |
# import pandas as pd | |
# from tempfile import NamedTemporaryFile | |
# from functions import * | |
# threshold=[0.6827917, | |
# 0.7136434, | |
# 0.510756, | |
# 0.56771123, | |
# 0.49417764, | |
# 0.45892453, | |
# 0.32996163, | |
# 0.5038406, | |
# 0.44855, | |
# 0.32959282, | |
# 0.45619836, | |
# 0.4969851] | |
# au_to_movements= { | |
# 'au1': 'inner brow raiser', | |
# 'au2': 'outer brow raiser', | |
# 'au4': 'brow lowerer', | |
# 'au5': 'upper lid raiser', | |
# 'au6': 'cheek raiser', | |
# 'au9': 'nose wrinkler', | |
# 'au12': 'lip corner puller', | |
# 'au15': 'lip corner depressor', | |
# 'au17': 'chin raiser', | |
# 'au20': 'lip stretcher', | |
# 'au25': 'lips part', | |
# 'au26': 'jaw drop' | |
# } | |
# au_labels = [ | |
# "au1", | |
# "au12", | |
# "au15", | |
# "au17", | |
# "au2", | |
# "au20", | |
# "au25", | |
# "au26", | |
# "au4", | |
# "au5", | |
# "au6", | |
# "au9" | |
# ] | |
# col=[au_to_movements[i] for i in au_labels] | |
# def binary_focal_loss(gamma=2.0, alpha=0.25): | |
# def focal_loss(y_true, y_pred): | |
# # Define epsilon to avoid log(0) | |
# epsilon = tf.keras.backend.epsilon() | |
# # Clip predictions to prevent log(0) and log(1 - 0) | |
# y_pred = tf.clip_by_value(y_pred, epsilon, 1.0 - epsilon) | |
# # Compute the focal loss | |
# fl = - alpha * (y_true * (1 - y_pred)**gamma * tf.math.log(y_pred) | |
# + (1 - y_true) * (y_pred**gamma) * tf.math.log(1 - y_pred)) | |
# return tf.reduce_mean(fl, axis=-1) | |
# return focal_loss | |
# loss = binary_focal_loss(gamma=2.0, alpha=0.25) | |
# # Function to read video frames into a list | |
# def read_video_frames(video_path): | |
# cap = cv2.VideoCapture(video_path) | |
# frames = [] | |
# while True: | |
# ret, frame = cap.read() | |
# if not ret: | |
# break | |
# frames.append(frame) | |
# cap.release() | |
# return frames | |
# # Function to process frames and make predictions | |
# def process_frames(frames, model): | |
# frames = [get_face(frame) for frame in tqdm(frames[:len(frames)-1])] | |
# st.text(f"face shape : {frames[0].shape}") | |
# frame_array = np.array(frames) | |
# preds = model.predict(frame_array) | |
# print(preds[0]) | |
# predicted_labels = np.zeros_like(preds,dtype='int') | |
# for i in range(12): | |
# predicted_labels[:, i] = (preds[:, i] > threshold[i]).astype(int) | |
# return predicted_labels | |
# # Function to save predictions to a CSV file | |
# def save_predictions_to_csv(predictions, filename="predictions.csv"): | |
# df = pd.DataFrame(predictions,columns=col) | |
# df.to_csv(filename, index=False) | |
# return filename | |
# # Load your Keras model | |
# def load_model(): | |
# model = tf.keras.models.load_model('incept_v3_10fps_full_0.4.keras', | |
# custom_objects={'binary_focal_loss': binary_focal_loss}) | |
# return model | |
# # Streamlit app | |
# def main(): | |
# st.title("Video Frame Prediction App") | |
# # Upload video file | |
# uploaded_file = st.file_uploader("Upload a video file", type=["mp4", "avi", "mov"]) | |
# if uploaded_file is not None: | |
# with NamedTemporaryFile(delete=False) as tmp_file: | |
# tmp_file.write(uploaded_file.read()) | |
# video_path = tmp_file.name | |
# # Load the model | |
# model = load_model() | |
# # Predict button | |
# if st.button("Predict"): | |
# # Read frames from video | |
# st.text("Reading video frames...") | |
# frames = read_video_frames(video_path) | |
# st.text(f"Total frames read: {len(frames)}") | |
# # Process frames and make predictions | |
# st.text("Processing frames and making predictions...") | |
# predictions = process_frames(frames, model) | |
# st.text("Predictions completed!") | |
# # Save predictions to CSV | |
# csv_file_path = save_predictions_to_csv(predictions) | |
# st.text("Predictions saved to CSV!") | |
# # Make CSV downloadable | |
# with open(csv_file_path, "rb") as f: | |
# st.download_button( | |
# label="Download CSV", | |
# data=f, | |
# file_name="predictions.csv", | |
# mime="text/csv" | |
# ) | |
# # Clean up the temporary file | |
# os.remove(video_path) | |
# if __name__ == "__main__": | |
# main() | |
import os | |
os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0' | |
import streamlit as st | |
import cv2 | |
from tqdm import tqdm | |
import numpy as np | |
import tensorflow as tf | |
import pandas as pd | |
from tempfile import NamedTemporaryFile | |
from functions import * | |
threshold = [ | |
0.6827917, 0.7136434, 0.510756, 0.56771123, 0.49417764, 0.45892453, | |
0.32996163, 0.5038406, 0.44855, 0.32959282, 0.45619836, 0.4969851 | |
] | |
au_to_movements = { | |
'au1': 'inner brow raiser', | |
'au2': 'outer brow raiser', | |
'au4': 'brow lowerer', | |
'au5': 'upper lid raiser', | |
'au6': 'cheek raiser', | |
'au9': 'nose wrinkler', | |
'au12': 'lip corner puller', | |
'au15': 'lip corner depressor', | |
'au17': 'chin raiser', | |
'au20': 'lip stretcher', | |
'au25': 'lips part', | |
'au26': 'jaw drop' | |
} | |
au_labels = [ | |
"au1", "au12", "au15", "au17", "au2", "au20", | |
"au25", "au26", "au4", "au5", "au6", "au9" | |
] | |
col = [au_to_movements[i] for i in au_labels] | |
def binary_focal_loss(gamma=2.0, alpha=0.25): | |
def focal_loss(y_true, y_pred): | |
epsilon = tf.keras.backend.epsilon() | |
y_pred = tf.clip_by_value(y_pred, epsilon, 1.0 - epsilon) | |
fl = - alpha * (y_true * (1 - y_pred)**gamma * tf.math.log(y_pred) | |
+ (1 - y_true) * (y_pred**gamma) * tf.math.log(1 - y_pred)) | |
return tf.reduce_mean(fl, axis=-1) | |
return focal_loss | |
loss = binary_focal_loss(gamma=2.0, alpha=0.25) | |
# Function to read video frames into a list and get timestamps | |
def read_video_frames(video_path): | |
cap = cv2.VideoCapture(video_path) | |
frames = [] | |
faces=[] | |
timestamps = [] | |
fps = cap.get(cv2.CAP_PROP_FPS) | |
while True: | |
ret, frame = cap.read() | |
if not ret: | |
break | |
face=get_face(frame) | |
if face is not None: | |
faces.append(face) | |
frames.append(frame) | |
timestamps.append(cap.get(cv2.CAP_PROP_POS_MSEC) / 1000.0) # Time in seconds | |
cap.release() | |
return frames,faces, timestamps | |
# Function to process frames and make predictions | |
def process_frames(frames, model): | |
frame_array = np.array(frames) | |
preds = model.predict(frame_array) | |
predicted_labels = np.zeros_like(preds, dtype='int') | |
for i in range(12): | |
predicted_labels[:, i] = (preds[:, i] > threshold[i]).astype(int) | |
return predicted_labels | |
# Function to save predictions to a CSV file with timestamps | |
def save_predictions_to_csv(predictions, timestamps, filename="predictions.csv"): | |
df = pd.DataFrame(predictions, columns=col) | |
df['timestamp'] = timestamps | |
df.set_index('timestamp', inplace=True) | |
df.to_csv(filename) | |
return filename | |
# Load your Keras model | |
def load_model(): | |
model = tf.keras.models.load_model('incept_v3_10fps_full_0.4.keras', | |
custom_objects={'binary_focal_loss': binary_focal_loss}) | |
return model | |
# Streamlit app | |
def main(): | |
st.title("Facial action unit detection") | |
uploaded_file = st.file_uploader("Upload a video file", type=["mp4", "avi", "mov"]) | |
if uploaded_file is not None: | |
with NamedTemporaryFile(delete=False) as tmp_file: | |
tmp_file.write(uploaded_file.read()) | |
video_path = tmp_file.name | |
model = load_model() | |
if st.button("Predict"): | |
st.text("Reading video frames...") | |
frames,faces, timestamps = read_video_frames(video_path) | |
st.text(f"Total frames in which faces found: {len(faces)}") | |
st.text("Processing frames and making predictions...") | |
predictions = process_frames(faces, model) | |
st.text("Predictions completed!") | |
csv_file_path = save_predictions_to_csv(predictions, timestamps) | |
st.text("Predictions saved to CSV!") | |
with open(csv_file_path, "rb") as f: | |
st.download_button( | |
label="Download CSV", | |
data=f, | |
file_name="predictions.csv", | |
mime="text/csv" | |
) | |
os.remove(video_path) | |
if __name__ == "__main__": | |
main() | |