File size: 4,689 Bytes
a952689
 
9751db3
 
a952689
9751db3
953a2bf
 
 
 
b9aeb1d
9751db3
7ad8314
953a2bf
a952689
 
953a2bf
 
 
 
a952689
 
 
9751db3
 
 
 
a952689
7ad8314
 
 
9751db3
7ad8314
953a2bf
 
9751db3
7ad8314
9751db3
7ad8314
953a2bf
7ad8314
9751db3
7ad8314
953a2bf
9751db3
7ad8314
9751db3
 
7ad8314
953a2bf
 
9751db3
 
 
 
953a2bf
7ad8314
9751db3
 
 
 
953a2bf
9751db3
 
 
 
953a2bf
9751db3
 
 
 
7ad8314
 
 
 
953a2bf
9751db3
953a2bf
9751db3
 
953a2bf
 
 
9751db3
953a2bf
9751db3
 
 
 
 
 
 
 
 
7ad8314
9751db3
7ad8314
b9aeb1d
953a2bf
9751db3
 
 
953a2bf
 
 
 
 
 
 
 
 
a952689
9751db3
 
a952689
9751db3
 
 
 
 
953a2bf
b9aeb1d
 
9751db3
b9aeb1d
9751db3
 
 
953a2bf
9751db3
 
7ad8314
9751db3
 
 
b9aeb1d
953a2bf
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import logging
from pathlib import Path
from typing import Union
from argparse import ArgumentParser
import cv2
from PIL import Image

# from src.analyze import analyze_and_visualize
from src.skin_analyzer import analyze_skin_function
from src.image import ImageBundle
import os
import numpy as np
import timeit

LOG = logging.getLogger(__name__)


def process_image(
    filename_or_url: Union[str, Path], analyze_skin, analyze_eyes, analyze_hair
):
    """
    Process the image and return the result.
    :param filename_or_url: The filename (in local devices) or URL (in Internet) of the image.
    :param analyze_skin: Whether to perform skin analysis.
    :param analyze_eyes: Whether to perform eye analysis.
    :param analyze_hair: Whether to perform hair analysis.
    :return: Analysis results.
    """
    # Load the image
    # time it
    start = timeit.default_timer()
    image_bundle = ImageBundle(image_source=filename_or_url)
    stop = timeit.default_timer()
    print("load image time: ", stop - start)

    # Detect faces and landmarks
    start = timeit.default_timer()
    face_data = image_bundle.detect_faces_and_landmarks()
    stop = timeit.default_timer()
    print("detect faces and landmarks time: ", stop - start)
    start = timeit.default_timer()
    landmarks = image_bundle.detect_face_landmarks()
    stop = timeit.default_timer()
    print("detect face landmarks time: ", stop - start)

    start = timeit.default_timer()
    # Perform segmentation
    segmentation_maps = image_bundle.segment_image()
    stop = timeit.default_timer()
    print("segment image time: ", stop - start)

    analysis_results = {}
    overlay_images = []

    image_np = image_bundle.numpy_image()
    print("image_np shape: ", image_np.shape)
    # import IPython; IPython.embed()

    if analyze_hair:
        hair_mask = segmentation_maps["hair_mask"]
        hair_analysis = analyze_hair_function(image_np, hair_mask)
        analysis_results["hair_analysis"] = hair_analysis
        overlay_images.append(segmentation_maps["hair_mask"])

    if analyze_skin:
        skin_mask = segmentation_maps["face_skin_mask"]

        skin_analysis = analyze_skin_function(image_np, skin_mask)
        overlay_images.append(skin_analysis["overlay_image"])
        if "overlay_image" in skin_analysis.keys():
            del skin_analysis["overlay_image"]
        if "filtered_skin_mask" in skin_analysis.keys():
            del skin_analysis["filtered_skin_mask"]
        if "dominant_skin_tones" in skin_analysis.keys():
            del skin_analysis["dominant_skin_tones"]
        analysis_results["skin_analysis"] = skin_analysis

        # del overlay_images[-1]

    if analyze_eyes:
        eye_mask = (
            segmentation_maps["right_eye_mask"] | segmentation_maps["left_eye_mask"]
        )
        eye_analysis = analyze_eye_function(image_np, eye_mask)
        analysis_results["eye_analysis"] = eye_analysis
        overlay_images.append(segmentation_maps["right_eye_mask"])

    # Combine overlay images
    if overlay_images:
        combined_overlay = np.maximum.reduce(overlay_images)
    else:
        combined_overlay = image_np

    # Convert combined_overlay to BGR for saving with OpenCV
    combined_overlay_bgr = cv2.cvtColor(combined_overlay, cv2.COLOR_RGB2BGR)

    return combined_overlay_bgr, analysis_results


if __name__ == "__main__":
    parser = ArgumentParser()
    parser.add_argument("-i", "--image_path", required=True, help="Path to the image")
    parser.add_argument(
        "--analyze_skin", action="store_true", help="Perform skin analysis"
    )
    parser.add_argument(
        "--analyze_eyes", action="store_true", help="Perform eye analysis"
    )
    parser.add_argument(
        "--analyze_hair", action="store_true", help="Perform hair analysis"
    )

    args = parser.parse_args()
    image_path = args.image_path

    # Process the image
    combined_overlay, analysis_results = process_image(
        image_path,
        analyze_skin=args.analyze_skin,
        analyze_eyes=args.analyze_eyes,
        analyze_hair=args.analyze_hair,
    )

    # Save the results
    im_basename = os.path.basename(image_path).split(".")[0]
    overlay_image_path = f"outputs/overlay_{im_basename}.png"
    cv2.imwrite(overlay_image_path, combined_overlay)
    import json

    # Save the analysis results as JSON, including the path to the overlay image
    analysis_results["overlay_image_path"] = overlay_image_path
    print(analysis_results)

    with open(f"outputs/analysis_{im_basename}.json", "w") as f:
        json.dump(analysis_results, f, indent=4)

    print("Analysis complete. Results saved in 'outputs' directory.")