Prévia do material em texto
Programa – Lê vídeo e gera Excel com medidas das emoções Carlos Alberto Gonçalves BH – Junho 2024 Prompt Elabore um programa Python que Leia um vídeo com expressões faciais Facial Action Coding System (FACS). Siga as seguintes instruções: (i)Faça um pedido de download do vídeo com a seguinte pergunta “Baixe o Vídeo:” e, em seguida armazene o vídeo para os cálculos, avaliação; (ii) calcule o tempo do vídeo em segundos e informe a “Duração do Vídeo em Segundos:” (iii) solicite como parâmetro o número de frames desejados para as medidas das emoções básicas (medo, nojo, raiva, surpresa, alegria, Neutra e tristeza.) em que serão medidas as emoções básicas universais. Essa medida será repassada em segundos também. Px exemplo, se o vídeo durar 60 segundos e o número de frames for como entrada 5 segundos, o número de frames será de 60/5 ou 12 frames de medida das emoções básicas, se for 10 segundos teremos 6 frames e assim por diante; (iv) as emoções serão medidas pelas intensidades das FACS (tipos de músculos faciais identificados no evento) sendo a escala de variações medidas entre 0,000 até 1,000 (decimais) conforme a intensidade da emoção no frame gerando uma planilha excel que que cada coluna contém as emoções e suas medidas e nas linhas o número do frame correspondente. Medir os diferentes movimentos dos músculos faciais que representa a ênfase para cada emoção no seu respectivo frame e colocar na tabela com precisão de 3 casas decimais; (v) Claro que em cada frame comparecem simultaneamente todas as 6 emoções com diferentes medidas de intensidade entre 0,000 e 1,000. Portanto, a linha do frame terá um valor de intensidade conforme as FACS (intensidade dos movimentos da FACs) para cada emoção universal. (vi) Para explicar melhor a saída veja a tabela adote o template a seguir: P Saida das emoções Frames Alegria Medo Tristeza Nojo Raiva Surpresa Nojo Neutro 1 0,234 0,200 0,000 0,003 0,600 0,002 0,002 0,001 2 0,002 3 4 .... n Médias x1 x2 ... DesviPad d1 d2 ... (vii) após Analises baixar a planilha Excel (viii) após baixar a planilha Excel perguntar se deseja continuar com o S (Sim) ou N (Não). Se o usuário responder S deve-se voltar para ler novo vídeo e continuar o processo gerando nova saída excel e assim continuamente até o usuário responde N, ou quit. Funciona para o Google Colaborative Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx import os import cv2 import pandas as pd from deepface import DeepFace def is_colab(): try: import google.colab return True except ImportError: return False def download_video(): if is_colab(): from google.colab import files uploaded = files.upload() for filename in uploaded.keys(): return filename else: return input("Digite o caminho do vídeo: ") def get_video_duration(video_path, default_frame_rate=30): cap = cv2.VideoCapture(video_path) frame_rate = cap.get(cv2.CAP_PROP_FPS) total_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT) if frame_rate == 0: print("Não foi possível obter a taxa de quadros do vídeo. Usando valor padrão de 30 FPS.") frame_rate = default_frame_rate video_duration = total_frames / frame_rate cap.release() return video_duration, frame_rate def analyze_video(video_path, frame_rate, capture_interval, output_excel): cap = cv2.VideoCapture(video_path) total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) video_duration = total_frames / frame_rate results = [] for second in range(0, int(video_duration), capture_interval): frame_number = int(second * frame_rate) if frame_number >= total_frames: print(f"Frame número {frame_number} está fora do alcance do vídeo.") break cap.set(cv2.CAP_PROP_POS_FRAMES, frame_number) ret, frame = cap.read() if not ret: print(f"Não foi possível ler o frame no segundo {second}.") continue face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray_frame, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) if len(faces) == 0: print(f"Nenhum rosto detectado no segundo {second}.") results.append([second, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000]) else: for (x, y, w, h) in faces: face = frame[y:y+h, x:x+w] face_rgb = cv2.cvtColor(face, cv2.COLOR_BGR2RGB) try: print(f"Analisando frame no segundo {second}...") analysis = DeepFace.analyze(face_rgb, actions=['emotion'], enforce_detection=False) emotion_scores = analysis[0]['emotion'] row = [second] + [ round(emotion_scores.get('happy', 0.0) / 100, 5), round(emotion_scores.get('fear', 0.0) / 100, 5), round(emotion_scores.get('sad', 0.0) / 100, 5), round(emotion_scores.get('disgust', 0.0) / 100, 5), round(emotion_scores.get('angry', 0.0) / 100, 5), round(emotion_scores.get('surprise', 0.0) / 100, 5), round(emotion_scores.get('neutral', 0.0) / 100, 5) ] print(f"Resultado da análise no segundo {second}: Alegria: {row[1]}, Medo: {row[2]}, Tristeza: {row[3]}, Nojo: {row[4]}, Raiva: {row[5]}, Surpresa: {row[6]}, Neutro: {row[7]}") results.append(row) except Exception as e: print(f"Erro ao processar o segundo {second}: {e}") results.append([second, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000]) cap.release() # Criação do DataFrame e cálculo da média e desvio padrão df = pd.DataFrame(results, columns=['Frames', 'Alegria', 'Medo', 'Tristeza', 'Nojo', 'Raiva', 'Surpresa', 'Neutro']) # Cálculo das médias e desvios padrões mean_row = pd.DataFrame([['Média'] + df.iloc[:, 1:].mean().round(5).tolist()], columns=df.columns) std_row = pd.DataFrame([['Desvio Padrão'] + df.iloc[:, 1:].std(ddof=1).round(5).tolist()], columns=df.columns) df = pd.concat([df, mean_row, std_row], ignore_index=True) df.to_excel(output_excel, index=False) print(f"Resultados salvos em {output_excel}") # Download do arquivo Excel se estiver no Colab if is_colab(): from google.colab import files files.download(output_excel) print(f"Arquivo Excel {output_excel} baixado no diretório de downloads padrão.") def main(): while True: print("Baixe o Vídeo:") video_path = download_video() video_duration, frame_rate = get_video_duration(video_path) print(f"Duração do Vídeo em Segundos: {video_duration:.4f}") # Verifica a extensão do vídeo video_extension = os.path.splitext(video_path)[1].lower() if video_extension not in [".mp4", ".mkv", ".avi", ".mov", ".wmv"]: print(f"Formato de vídeo {video_extension} não suportado.") continue try: frame_rate = float(input("Digite a taxa de frames por segundo (FPS): ").strip()) except ValueError: frame_rate = 30 # Valor padrão se a entrada for inválida print("Entrada inválida. Usando valor padrão de 30 FPS.") while True: try: capture_interval = int(input("Digite o intervalo de captura em segundos: ").strip()) break except ValueError:print("Por favor, insira um número inteiro válido para o intervalo de captura.") output_excel = os.path.splitext(video_path)[0] + '.xlsx' analyze_video(video_path, frame_rate, capture_interval, output_excel) # Pergunta se deseja analisar outro vídeo após o download do Excel continuar = input("Quer processar outro vídeo? (S/N): ").strip().upper() if continuar != "S": print("FIM") break if __name__ == "__main__": main() xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Resposta para o Vídeo07 Frames Alegria Medo Tristeza Nojo Raiva Surpresa Neutro 0 0 0,08020 0 0 0 0,941 0,057 4 0 0,24851 0,038 0 0,692 0,001 0,023 8 0 0,10712 0,012 0,001 0,855 0,003 0,021 12 0 0,02922 0,084 0 0,746 0 0,14 16 0 0,00600 0,779 0 0,061 0 0,154 20 0 0 0 0 0 0 0 24 0 0,00661 0,193 0 0,8 0 0,006 28 0 0,06603 0,106 0 0,884 0 0,007 32 0 0,00771 0,53 0 0,456 0 0,014 36 0 0 0 0 0 0 0 40 0 00 0 0 0 0 0 Média 0 0,07736 0,158 0 0,409 0,086 0,038 Desvio Padrão 0 0,076 0,259 0 0,395 0,284 0,056 Ver consegue editar esse vídeo no youtube e salva-lo em mp4 https://www.google.com/search?client=firefox-b-d&q=tem+um+v%C3%ADdeo+mp4+de+duelo+do+Clint+Eastwood%3F#fpstate=ive&vld=cid:15c576ec,vid:HtoRQA-lUvs,st:0