File size: 2,358 Bytes
cb43729
5896395
 
 
 
06ce79b
5896395
 
740be3d
5896395
c52bc1e
 
 
 
 
 
 
 
5896395
c52bc1e
 
 
 
 
5896395
c52bc1e
 
5896395
c52bc1e
 
 
5896395
c52bc1e
 
 
5896395
c52bc1e
 
 
5896395
c52bc1e
5896395
c52bc1e
 
5896395
 
06ce79b
05e48fe
 
 
 
ee9a7bf
05e48fe
 
ee9a7bf
05e48fe
 
06ce79b
ee9a7bf
c0766d3
e6911ff
5896395
c0766d3
06ce79b
c0766d3
06ce79b
 
c0766d3
06ce79b
 
e6911ff
 
 
 
 
 
 
 
5896395
e6911ff
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
import spaces
import base64
import cv2
import numpy as np
import gradio as gr
from PIL import Image
from io import BytesIO

@spaces.GPU
def crop_face(base64_image):
    try:
        # Decode the base64 image
        img_data = base64.b64decode(base64_image)
        np_arr = np.frombuffer(img_data, np.uint8)
        image = cv2.imdecode(np_arr, cv2.IMREAD_COLOR)
        
        if image is None:
            return "Could not decode the image or no data in buffer"
    
        # Load the pre-trained face detector
        face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

        # Convert the image to grayscale
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

        # Detect faces in the image
        faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

        # If no faces are detected, return message
        if len(faces) == 0:
            return "No faces found"

        # Crop the first face found
        x, y, w, h = faces[0]
        face_crop = image[y:y+h, x:x+w]

        # Encode the cropped face to base64
        _, buffer = cv2.imencode('.jpg', face_crop)
        face_base64 = base64.b64encode(buffer).decode('utf-8')

        return face_base64

    except Exception as e:
        return f"An error occurred: {str(e)}"


def image_to_base64(image):
    try:
        buffered = BytesIO()
        image.save(buffered, format="JPEG")
        img_str = base64.b64encode(buffered.getvalue()).decode('utf-8')
        print("Encoded String:", img_str[:100])  # Print the first 100 characters
        return img_str
    except Exception as e:
        print("Error:", str(e))
        return f"An error occurred: {str(e)}"



# Define the Gradio interfaces


base64_converter_interface = gr.Interface(
    fn=image_to_base64,
    inputs=gr.Image(),
    outputs="text",
    title="Image to Base64 Converter",
    description="Upload an image to convert it to a Base64 encoded string."
)

face_crop_interface = gr.Interface(
    fn=crop_face,
    inputs="text",
    outputs="text",
    title="Face Cropper",
    description="Input a base64 encoded image to get a base64 encoded cropped face."
)

if __name__ == "__main__":
    gr.TabbedInterface([face_crop_interface, base64_converter_interface], ["Convert to Base64","Crop Face"]).launch()