|
from PIL import Image, ImageChops |
|
import requests |
|
import os |
|
import torch |
|
import functools |
|
import numpy as np |
|
import cv2 |
|
from skimage.metrics import structural_similarity as compare_ssim |
|
from moviepy.editor import VideoFileClip |
|
|
|
from modules.utils.paths import * |
|
|
|
|
|
TEST_IMAGE_URL = "https://github.com/microsoft/onnxjs-demo/raw/master/src/assets/EmotionSampleImages/sad_baby.jpg" |
|
TEST_VIDEO_URL = "https://github.com/jhj0517/sample-medias/raw/master/vids/human-face/expression01_short.mp4" |
|
TEST_IMAGE_PATH = os.path.normpath(os.path.join(PROJECT_ROOT_DIR, "tests", "test.png")) |
|
TEST_VIDEO_PATH = os.path.normpath(os.path.join(PROJECT_ROOT_DIR, "tests", "test_expression.mp4")) |
|
TEST_EXPRESSION_OUTPUT_PATH = os.path.normpath(os.path.join(PROJECT_ROOT_DIR, "tests", "edited_expression.png")) |
|
TEST_EXPRESSION_AAA = 100 |
|
|
|
|
|
def download_image(url, path): |
|
if os.path.exists(path): |
|
return |
|
|
|
response = requests.get(url, stream=True) |
|
if response.status_code == 200: |
|
with open(path, 'wb') as file: |
|
for chunk in response.iter_content(1024): |
|
file.write(chunk) |
|
print(f"Image successfully downloaded to {path}") |
|
else: |
|
raise Exception(f"Failed to download image. Status code: {response.status_code}") |
|
|
|
|
|
def are_images_different(image1_path: str, image2_path: str): |
|
image1 = Image.open(image1_path) |
|
image2 = Image.open(image2_path) |
|
|
|
diff = ImageChops.difference(image1, image2) |
|
|
|
if diff.getbbox() is None: |
|
return False |
|
else: |
|
return True |
|
|
|
|
|
def are_videos_different(video1_path: str, video2_path: str): |
|
cap1 = cv2.VideoCapture(video1_path) |
|
cap2 = cv2.VideoCapture(video2_path) |
|
|
|
while True: |
|
ret1, frame1 = cap1.read() |
|
ret2, frame2 = cap2.read() |
|
|
|
if not ret1 or not ret2: |
|
if ret1 != ret2: |
|
return True |
|
break |
|
|
|
if frame1.shape != frame2.shape: |
|
frame1 = cv2.resize(frame1, (frame2.shape[1], frame2.shape[0])) |
|
|
|
score, _ = compare_ssim(frame1, frame2, full=True, multichannel=True) |
|
|
|
if score < 0.99: |
|
return True |
|
|
|
cap1.release() |
|
cap2.release() |
|
return False |
|
|
|
|
|
def validate_video(video_path): |
|
cap = cv2.VideoCapture(video_path) |
|
if not cap.isOpened(): |
|
print("Could not open video file.") |
|
return False |
|
|
|
frame_count = 0 |
|
while True: |
|
ret, frame = cap.read() |
|
if not ret: |
|
break |
|
frame_count += 1 |
|
|
|
cap.release() |
|
|
|
if frame_count == 0: |
|
print("No frames found in video file.") |
|
return False |
|
|
|
return True |
|
|
|
|
|
def has_sound(video_path: str): |
|
try: |
|
video = VideoFileClip(video_path) |
|
return video.audio is not None |
|
except Exception as e: |
|
return False |
|
|
|
|
|
@functools.lru_cache |
|
def is_cuda_available(): |
|
return torch.cuda.is_available() |
|
|
|
|