Spaces:
Runtime error
Runtime error
File size: 4,296 Bytes
9e0f5c5 c463c33 9e0f5c5 6b368fb 9e0f5c5 6b368fb 9e0f5c5 6b368fb 9e0f5c5 939c610 9e0f5c5 939c610 6b368fb 9e0f5c5 6b368fb 9e0f5c5 6b368fb 9e0f5c5 6b368fb 9e0f5c5 6b368fb 9e0f5c5 6b368fb 9e0f5c5 6b368fb 9e0f5c5 6b368fb 9e0f5c5 6b368fb 9e0f5c5 6b368fb 9e0f5c5 6b368fb 9e0f5c5 6b368fb 9e0f5c5 72adf42 6b368fb 9e0f5c5 72adf42 9e0f5c5 6b368fb 72adf42 939c610 6b368fb 9e0f5c5 939c610 6b368fb 9e0f5c5 6b368fb 9e0f5c5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
import gradio as gr
import cv2
import os
import boto3
aws_access_key_id = os.getenv('AWS_ACCESS_KEY_ID')
aws_secret_access_key = os.getenv('AWS_SECRET_ACCESS_KEY')
s3_client = boto3.client(
's3',
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
region_name='eu-central-1'
)
def upload_to_s3(bucket_name, folder_name):
image_paths = []
for filename in os.listdir(folder_name):
if filename.endswith('.png'):
file_path = os.path.join(folder_name, filename)
s3_client.upload_file(file_path, bucket_name, f"{folder_name}/{filename}")
image_paths.append(file_path)
return image_paths
def process_video(uploaded_video, name, surname, interval_ms):
try:
video_source = uploaded_video
if video_source is None:
return "No video file provided.", []
folder_name = f"{name}_{surname}"
os.makedirs(folder_name, exist_ok=True)
# Video processing logic
# Use video_source directly as it's a file path (string)
temp_video_path = video_source
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
vidcap = cv2.VideoCapture(temp_video_path)
if not vidcap.isOpened():
raise Exception("Failed to open video file.")
fps = vidcap.get(cv2.CAP_PROP_FPS)
frame_interval = int(fps * (interval_ms / 1000))
frame_count = 0
saved_image_count = 0
success, image = vidcap.read()
image_paths = []
while success and saved_image_count < 86:
if frame_count % frame_interval == 0:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.2, 4)
for (x, y, w, h) in faces:
# Additional checks for face region validation
aspect_ratio = w / h
if aspect_ratio > 0.75 and aspect_ratio < 1.33 and w * h > 4000: # Example thresholds
face = image[y:y+h, x:x+w]
face_resized = cv2.resize(face, (160, 160))
image_filename = os.path.join(folder_name, f"{name}_{surname}_{saved_image_count:04d}.png")
cv2.imwrite(image_filename, face_resized)
image_paths.append(image_filename)
saved_image_count += 1
if saved_image_count >= 86:
break
success, image = vidcap.read()
frame_count += 1
vidcap.release()
bucket_name = 'newimagesupload00'
uploaded_images = upload_to_s3(bucket_name, folder_name)
return f"Saved and uploaded {saved_image_count} face images", uploaded_images
except Exception as e:
return f"An error occurred: {e}", []
example_video_path = "examples/vid.mp4"
if os.path.exists(example_video_path):
with open(example_video_path, "rb") as file:
example_video_bytes = file.read()
else:
example_video_bytes = None
# Gradio Interface
with gr.Blocks() as demo:
gr.Markdown("### Video Uploader and Face Detector")
gr.Markdown("Download the example video to try it out, or upload your own video to add your images to the dataset!")
gr.Markdown("Make a short 5-7 seconds video as shown in the example, with good lighting and visible face for best results.")
with gr.Row():
with gr.Column():
video = gr.File(label="Upload Your Video, Like This!", type="video", value=example_video_bytes)
with gr.Column():
name = gr.Textbox(label="Name")
surname = gr.Textbox(label="Surname")
interval = gr.Number(label="Interval in milliseconds", value=100)
submit_button = gr.Button("Submit")
with gr.Column():
gallery = gallery = gr.Gallery(
label="Generated images", show_label=False, elem_id="gallery"
, columns=[3], rows=[1], object_fit="contain", height="auto")
submit_button.click(
fn=process_video,
inputs=[video, name, surname, interval],
outputs=[gr.Text(label="Result"), gallery]
)
# CSS for styling (optional)
css = """
body { font-family: Arial, sans-serif; }
"""
demo.launch()
|