Zeph27 commited on
Commit
56d0f44
·
1 Parent(s): 3e810e4

Add image files using Git LFS

Browse files
Files changed (39) hide show
  1. Movie Pose Style/Option 1/clip-f.png +3 -0
  2. Movie Pose Style/Option 1/clip-m.png +3 -0
  3. Movie Pose Style/Option 1/image.png +3 -0
  4. Movie Pose Style/Option 1/man1.png +3 -0
  5. Movie Pose Style/Option 1/woman1.png +3 -0
  6. Movie Pose Style/Option 2/clip-f.png +3 -0
  7. Movie Pose Style/Option 2/clip-m.png +3 -0
  8. Movie Pose Style/Option 2/image.png +3 -0
  9. Movie Pose Style/Option 2/man2.png +3 -0
  10. Movie Pose Style/Option 2/woman2.png +3 -0
  11. Movie Pose Style/Option 3/clip-f.png +3 -0
  12. Movie Pose Style/Option 3/clip-m.png +3 -0
  13. Movie Pose Style/Option 3/image.png +3 -0
  14. Movie Pose Style/Option 3/man3.png +3 -0
  15. Movie Pose Style/Option 3/woman3.png +3 -0
  16. Movie Pose Style/Option 4/clip-f.png +3 -0
  17. Movie Pose Style/Option 4/clip-m.png +3 -0
  18. Movie Pose Style/Option 4/image.png +3 -0
  19. Movie Pose Style/Option 4/man4.png +3 -0
  20. Movie Pose Style/Option 4/woman4.png +3 -0
  21. Movie Pose Style/Option 5/clip-f.png +3 -0
  22. Movie Pose Style/Option 5/clip-m.png +3 -0
  23. Movie Pose Style/Option 5/image.png +3 -0
  24. Movie Pose Style/Option 5/man5.png +3 -0
  25. Movie Pose Style/Option 5/woman5.png +3 -0
  26. Movie Pose Style/Option 6/clip-f.png +3 -0
  27. Movie Pose Style/Option 6/clip-m.png +3 -0
  28. Movie Pose Style/Option 6/image.png +3 -0
  29. Movie Pose Style/Option 6/man6.png +3 -0
  30. Movie Pose Style/Option 6/woman6.png +3 -0
  31. app copy.py +94 -0
  32. app.py +45 -11
  33. install +17 -0
  34. test_images/clipspace-mask-4722992.png +0 -0
  35. test_images/clipspace-mask-4736783.png +0 -0
  36. test_images/man.png +0 -0
  37. test_images/woman.png +0 -0
  38. test_images/user3-f.jpg → user3-f.jpg +0 -0
  39. test_images/user3.jpg → user3-m.jpg +0 -0
Movie Pose Style/Option 1/clip-f.png ADDED

Git LFS Details

  • SHA256: e915077633f62f85c3ce320bc15b26651492652abb9c509008bfe9d5e8aa5583
  • Pointer size: 131 Bytes
  • Size of remote file: 413 kB
Movie Pose Style/Option 1/clip-m.png ADDED

Git LFS Details

  • SHA256: 4b249e9d5881d327c04ea0b6ad61840df47c459ed181dde8fa768c96dc44e005
  • Pointer size: 131 Bytes
  • Size of remote file: 327 kB
Movie Pose Style/Option 1/image.png ADDED

Git LFS Details

  • SHA256: ed954febbbd6e0f6c15e32e62a93f055b0b5e31ad959d344a1f82269bf594e91
  • Pointer size: 132 Bytes
  • Size of remote file: 1.07 MB
Movie Pose Style/Option 1/man1.png ADDED

Git LFS Details

  • SHA256: 4e7e9def0eba31726a806a9cd51aef32340042c2f20cd180acb741caf4c5141b
  • Pointer size: 131 Bytes
  • Size of remote file: 282 kB
Movie Pose Style/Option 1/woman1.png ADDED

Git LFS Details

  • SHA256: febd360321e4da555a66b6fce17567a8d1a380dd6903f35c1e684cd92535a50f
  • Pointer size: 131 Bytes
  • Size of remote file: 357 kB
Movie Pose Style/Option 2/clip-f.png ADDED

Git LFS Details

  • SHA256: 64f676549895202d23a2c323ce3b5c670f3e8ec5b8ac3e83f9b7842e03475839
  • Pointer size: 131 Bytes
  • Size of remote file: 252 kB
Movie Pose Style/Option 2/clip-m.png ADDED

Git LFS Details

  • SHA256: a1ce9d04872da780f3c409248dac964872591046971118c9d33fcc69557e3ad2
  • Pointer size: 131 Bytes
  • Size of remote file: 361 kB
Movie Pose Style/Option 2/image.png ADDED

Git LFS Details

  • SHA256: 35d731ac96a82814ccf7247e77442273727df149611d3f98aaec815bac0d0d93
  • Pointer size: 132 Bytes
  • Size of remote file: 1.12 MB
Movie Pose Style/Option 2/man2.png ADDED

Git LFS Details

  • SHA256: 20bb5d014b110d34bf9a9ec265bd0620ca04cbe745c8078f3438f151a3ff4a46
  • Pointer size: 131 Bytes
  • Size of remote file: 319 kB
Movie Pose Style/Option 2/woman2.png ADDED

Git LFS Details

  • SHA256: 17ef8f2db8aad874687c716fb146ce6cb4704741fb7924c0548daae87e67de1a
  • Pointer size: 131 Bytes
  • Size of remote file: 223 kB
Movie Pose Style/Option 3/clip-f.png ADDED

Git LFS Details

  • SHA256: 163d223321c2647df59bc99f4ace286a7a63bae60277048d15e7c84470ac992d
  • Pointer size: 131 Bytes
  • Size of remote file: 347 kB
Movie Pose Style/Option 3/clip-m.png ADDED

Git LFS Details

  • SHA256: b6e64bb189e6d6d28a8a8f13276984ea8844d74cc96466f08de6f2794cc9fbd6
  • Pointer size: 131 Bytes
  • Size of remote file: 358 kB
Movie Pose Style/Option 3/image.png ADDED

Git LFS Details

  • SHA256: d837a2e37e1e23b4c8512b4a29b932e9e5caae6e66e5405b8b57e17c66e11e74
  • Pointer size: 132 Bytes
  • Size of remote file: 1.17 MB
Movie Pose Style/Option 3/man3.png ADDED

Git LFS Details

  • SHA256: ba7cf388e4c2f86dfce5bc57184b00045b78eda831900ea730e70777a60e287b
  • Pointer size: 131 Bytes
  • Size of remote file: 316 kB
Movie Pose Style/Option 3/woman3.png ADDED

Git LFS Details

  • SHA256: d66b19d157754d8d4068d72360e56d8a9ed03d1ea2511d3e4201dcd8b3beb647
  • Pointer size: 131 Bytes
  • Size of remote file: 301 kB
Movie Pose Style/Option 4/clip-f.png ADDED

Git LFS Details

  • SHA256: 95628867bd048f50a00af9151fce9e46b053a8adbcd9659971ede29ec598df21
  • Pointer size: 131 Bytes
  • Size of remote file: 277 kB
Movie Pose Style/Option 4/clip-m.png ADDED

Git LFS Details

  • SHA256: 4f9688bc2c569c38860071156a1177000e930c7b561269b7b21caf5fbac8913a
  • Pointer size: 131 Bytes
  • Size of remote file: 358 kB
Movie Pose Style/Option 4/image.png ADDED

Git LFS Details

  • SHA256: be82326ee3a3108afdaaa8486c6e10b6e0b3503f468036dddb6432684c9d1f4f
  • Pointer size: 132 Bytes
  • Size of remote file: 1.17 MB
Movie Pose Style/Option 4/man4.png ADDED

Git LFS Details

  • SHA256: 862e6ec010d3596d83942146564abafe9843d4b4529689f43af0f1e1b5a6c1f2
  • Pointer size: 131 Bytes
  • Size of remote file: 315 kB
Movie Pose Style/Option 4/woman4.png ADDED

Git LFS Details

  • SHA256: 4d877ce548d303d548233d677e34f321cd199771b2b8e4f3cf9bd81e6c4a6b33
  • Pointer size: 131 Bytes
  • Size of remote file: 242 kB
Movie Pose Style/Option 5/clip-f.png ADDED

Git LFS Details

  • SHA256: b6852a840a88dad0ed9dff646a94ade385bfe593aab305532cc9dc4dd8cca79b
  • Pointer size: 131 Bytes
  • Size of remote file: 175 kB
Movie Pose Style/Option 5/clip-m.png ADDED

Git LFS Details

  • SHA256: 491ab4a308693726ee8fa8eabc3eec5c787a64d795c59d8bb900d332922dd074
  • Pointer size: 131 Bytes
  • Size of remote file: 184 kB
Movie Pose Style/Option 5/image.png ADDED

Git LFS Details

  • SHA256: 7f23728a65aa03ea41dc87c4b1c1a3bfcd340d18f85b4b19a5ebcfe448e7aacb
  • Pointer size: 132 Bytes
  • Size of remote file: 1.06 MB
Movie Pose Style/Option 5/man5.png ADDED

Git LFS Details

  • SHA256: 9a6c956a13c1d63163df8b59a9d449a74649cd8feb23646da4ac9cd23201ec69
  • Pointer size: 131 Bytes
  • Size of remote file: 185 kB
Movie Pose Style/Option 5/woman5.png ADDED

Git LFS Details

  • SHA256: 5376c3565929ea187410a132ef53adc8cc80b905897170db7dce2ddb77cc121d
  • Pointer size: 131 Bytes
  • Size of remote file: 172 kB
Movie Pose Style/Option 6/clip-f.png ADDED

Git LFS Details

  • SHA256: d8dd983d4fa77c49fd5b47e3f8e6bdf375cc72da285b43f4593dfb02277cad8c
  • Pointer size: 131 Bytes
  • Size of remote file: 672 kB
Movie Pose Style/Option 6/clip-m.png ADDED

Git LFS Details

  • SHA256: 3a7020335a1c29f05a8d63efc316accca13f9b7ee2383fecd32e7615e8b44ccf
  • Pointer size: 131 Bytes
  • Size of remote file: 523 kB
Movie Pose Style/Option 6/image.png ADDED

Git LFS Details

  • SHA256: 6675d4e807c5b8a5fec7c1c21157ff83b7c3aef92f707f9cd357d1f1c2a5a314
  • Pointer size: 132 Bytes
  • Size of remote file: 1.26 MB
Movie Pose Style/Option 6/man6.png ADDED

Git LFS Details

  • SHA256: 5832775a1e62f1cde5261d95d77d081dc3f231726db68f59427892d71321a634
  • Pointer size: 131 Bytes
  • Size of remote file: 432 kB
Movie Pose Style/Option 6/woman6.png ADDED

Git LFS Details

  • SHA256: 854807d7b118f3c57b604f2c794070ba3aee47b46fe751c9b5971af322eef265
  • Pointer size: 131 Bytes
  • Size of remote file: 559 kB
app copy.py ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import asyncio
3
+ import fal_client
4
+ from dotenv import load_dotenv
5
+ import os
6
+ from pathlib import Path
7
+ import time
8
+
9
+ load_dotenv()
10
+ os.environ["FAL_KEY"] = os.getenv("FAL_API_KEY")
11
+
12
+ async def generate_paris_images(image1_path: str, image2_path: str, woman_prompt: str, man_prompt: str, batch_size: int, progress=gr.Progress()):
13
+ start_time = time.time()
14
+ print("Progress: 5% - Starting Paris image generation...")
15
+ progress(0.05, desc="Starting Paris image generation...")
16
+
17
+ # Upload all images in parallel
18
+ upload_tasks = [
19
+ fal_client.upload_file_async(str(image1_path)),
20
+ fal_client.upload_file_async(str(image2_path)),
21
+ fal_client.upload_file_async("test_images/woman.png"),
22
+ fal_client.upload_file_async("test_images/man.png"),
23
+ fal_client.upload_file_async("test_images/clipspace-mask-4736783.png"),
24
+ fal_client.upload_file_async("test_images/clipspace-mask-4722992.png")
25
+ ]
26
+
27
+ [image1_url, image2_url, woman_img, man_img, mask1_img, mask2_img] = await asyncio.gather(*upload_tasks)
28
+
29
+ print("Progress: 40% - Uploaded all images")
30
+ progress(0.4, desc="Uploaded all images")
31
+
32
+ handler = await fal_client.submit_async(
33
+ "comfy/LVE/paris-couple",
34
+ arguments={
35
+ "loadimage_1": image1_url,
36
+ "loadimage_2": image2_url,
37
+ "loadimage_3": woman_img,
38
+ "loadimage_4": mask1_img,
39
+ "loadimage_5": mask2_img,
40
+ "loadimage_6": man_img,
41
+ "woman_prompt": woman_prompt,
42
+ "man_prompt": man_prompt,
43
+ "batch_size": batch_size
44
+ }
45
+ )
46
+
47
+ print("Progress: 60% - Processing images...")
48
+ progress(0.6, desc="Processing images...")
49
+
50
+ result = await handler.get()
51
+ print(result)
52
+
53
+ end_time = time.time()
54
+ processing_time = end_time - start_time
55
+ print(f"Progress: 100% - Generation completed in {processing_time:.2f} seconds")
56
+ progress(1.0, desc=f"Generation completed in {processing_time:.2f} seconds")
57
+
58
+ # Return all generated image URLs and processing time
59
+ # Get the first key from outputs dynamically
60
+ return (
61
+ [img["url"] for img in result["outputs"][next(iter(result["outputs"]))]["images"]] if "outputs" in result and result["outputs"] else [],
62
+ f"Processing time: {processing_time:.2f} seconds"
63
+ )
64
+
65
+ with gr.Blocks() as demo:
66
+ with gr.Row():
67
+ image1_input = gr.Image(label="Upload Woman Image", type="filepath", value="test_images/user3-f.jpg")
68
+ image2_input = gr.Image(label="Upload Man Image", type="filepath", value="test_images/user3.jpg")
69
+
70
+ with gr.Row():
71
+ woman_prompt = gr.Textbox(
72
+ label="Woman Prompt",
73
+ value="Close-up, portrait photo, a woman, Paris nighttime romance scene, wearing an elegant black dress with a shawl, standing beneath the same canopy of twinkling lights along the Champs-Élysées, the Eiffel Tower glowing bright in the distance, soft mist rising from the street, looking at the camera."
74
+ )
75
+ man_prompt = gr.Textbox(
76
+ label="Man Prompt",
77
+ value="Close-up, portrait photo, a man, Paris nighttime romance scene, wearing a tailored suit with a crisp white shirt, standing beneath a canopy of twinkling lights along the Champs-Élysées, the Eiffel Tower glowing bright in the distance, soft mist rising from the street, looking at the camera."
78
+ )
79
+
80
+ batch_size = gr.Slider(minimum=1, maximum=8, value=4, step=1, label="Batch Size")
81
+
82
+ generate_btn = gr.Button("Generate")
83
+ image_output = gr.Gallery(label="Generated Image")
84
+ time_output = gr.Textbox(label="Processing Time")
85
+
86
+ generate_btn.click(
87
+ fn=generate_paris_images,
88
+ inputs=[image1_input, image2_input, woman_prompt, man_prompt, batch_size],
89
+ outputs=[image_output, time_output]
90
+ )
91
+
92
+ if __name__ == "__main__":
93
+ print("Starting Gradio interface...")
94
+ demo.launch()
app.py CHANGED
@@ -9,22 +9,33 @@ import time
9
  load_dotenv()
10
  os.environ["FAL_KEY"] = os.getenv("FAL_API_KEY")
11
 
12
- async def generate_paris_images(image1_path: str, image2_path: str, woman_prompt: str, man_prompt: str, batch_size: int, progress=gr.Progress()):
13
  start_time = time.time()
14
  print("Progress: 5% - Starting Paris image generation...")
15
  progress(0.05, desc="Starting Paris image generation...")
16
 
 
 
 
 
 
 
 
 
 
 
 
17
  # Upload all images in parallel
18
  upload_tasks = [
19
  fal_client.upload_file_async(str(image1_path)),
20
  fal_client.upload_file_async(str(image2_path)),
21
- fal_client.upload_file_async("test_images/woman.png"),
22
- fal_client.upload_file_async("test_images/man.png"),
23
- fal_client.upload_file_async("test_images/clipspace-mask-4736783.png"),
24
- fal_client.upload_file_async("test_images/clipspace-mask-4722992.png")
25
  ]
26
 
27
- [image1_url, image2_url, woman_img, man_img, mask1_img, mask2_img] = await asyncio.gather(*upload_tasks)
28
 
29
  print("Progress: 40% - Uploaded all images")
30
  progress(0.4, desc="Uploaded all images")
@@ -62,19 +73,36 @@ async def generate_paris_images(image1_path: str, image2_path: str, woman_prompt
62
  f"Processing time: {processing_time:.2f} seconds"
63
  )
64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  with gr.Blocks() as demo:
66
  with gr.Row():
67
- image1_input = gr.Image(label="Upload Woman Image", type="filepath", value="test_images/user3-f.jpg")
68
- image2_input = gr.Image(label="Upload Man Image", type="filepath", value="test_images/user3.jpg")
 
 
 
69
 
70
  with gr.Row():
71
  woman_prompt = gr.Textbox(
72
  label="Woman Prompt",
73
- value="Close-up, portrait photo, a woman, Paris nighttime romance scene, wearing an elegant black dress with a shawl, standing beneath the same canopy of twinkling lights along the Champs-Élysées, the Eiffel Tower glowing bright in the distance, soft mist rising from the street, looking at the camera."
74
  )
75
  man_prompt = gr.Textbox(
76
  label="Man Prompt",
77
- value="Close-up, portrait photo, a man, Paris nighttime romance scene, wearing a tailored suit with a crisp white shirt, standing beneath a canopy of twinkling lights along the Champs-Élysées, the Eiffel Tower glowing bright in the distance, soft mist rising from the street, looking at the camera."
78
  )
79
 
80
  batch_size = gr.Slider(minimum=1, maximum=8, value=4, step=1, label="Batch Size")
@@ -85,10 +113,16 @@ with gr.Blocks() as demo:
85
 
86
  generate_btn.click(
87
  fn=generate_paris_images,
88
- inputs=[image1_input, image2_input, woman_prompt, man_prompt, batch_size],
89
  outputs=[image_output, time_output]
90
  )
91
 
 
 
 
 
 
 
92
  if __name__ == "__main__":
93
  print("Starting Gradio interface...")
94
  demo.launch()
 
9
  load_dotenv()
10
  os.environ["FAL_KEY"] = os.getenv("FAL_API_KEY")
11
 
12
+ async def generate_paris_images(product_name: str, image1_path: str, image2_path: str, woman_prompt: str, man_prompt: str, batch_size: int, progress=gr.Progress()):
13
  start_time = time.time()
14
  print("Progress: 5% - Starting Paris image generation...")
15
  progress(0.05, desc="Starting Paris image generation...")
16
 
17
+ product_number = product_name.split(" ")[1]
18
+ man_img = f"Movie Pose Style/Option {product_number}/man{product_number}.png"
19
+ woman_img = f"Movie Pose Style/Option {product_number}/woman{product_number}.png"
20
+ man_mask = f"Movie Pose Style/Option {product_number}/clip-m.png"
21
+ woman_mask = f"Movie Pose Style/Option {product_number}/clip-f.png"
22
+
23
+ print(f"man_img: {man_img}")
24
+ print(f"woman_img: {woman_img}")
25
+ print(f"man_mask: {man_mask}")
26
+ print(f"woman_mask: {woman_mask}")
27
+
28
  # Upload all images in parallel
29
  upload_tasks = [
30
  fal_client.upload_file_async(str(image1_path)),
31
  fal_client.upload_file_async(str(image2_path)),
32
+ fal_client.upload_file_async(man_img),
33
+ fal_client.upload_file_async(woman_img),
34
+ fal_client.upload_file_async(woman_mask),
35
+ fal_client.upload_file_async(man_mask)
36
  ]
37
 
38
+ [image1_url, image2_url, man_img, woman_img, mask1_img, mask2_img] = await asyncio.gather(*upload_tasks)
39
 
40
  print("Progress: 40% - Uploaded all images")
41
  progress(0.4, desc="Uploaded all images")
 
73
  f"Processing time: {processing_time:.2f} seconds"
74
  )
75
 
76
+ def change_product_preview(product_name):
77
+ if product_name == "Pose 1":
78
+ return "Movie Pose Style/Option 1/image.png"
79
+ elif product_name == "Pose 2":
80
+ return "Movie Pose Style/Option 2/image.png"
81
+ elif product_name == "Pose 3":
82
+ return "Movie Pose Style/Option 3/image.png"
83
+ elif product_name == "Pose 4":
84
+ return "Movie Pose Style/Option 4/image.png"
85
+ elif product_name == "Pose 5":
86
+ return "Movie Pose Style/Option 5/image.png"
87
+ elif product_name == "Pose 6":
88
+ return "Movie Pose Style/Option 6/image.png"
89
+
90
  with gr.Blocks() as demo:
91
  with gr.Row():
92
+ product_name = gr.Dropdown(label="Product Name", choices=["Pose 1", "Pose 2", "Pose 3", "Pose 4", "Pose 5", "Pose 6"], value="Pose 1")
93
+ product_preview = gr.Image(label="Product Preview", type="filepath", value="Movie Pose Style/Option 1/image.png", height=500, width=500)
94
+ with gr.Row():
95
+ image1_input = gr.Image(label="Upload Woman Image", type="filepath", value="user3-f.jpg")
96
+ image2_input = gr.Image(label="Upload Man Image", type="filepath", value="user3-m.jpg")
97
 
98
  with gr.Row():
99
  woman_prompt = gr.Textbox(
100
  label="Woman Prompt",
101
+ value="Close-up, intimate portrait, a woman wearing a delicate pink floral embellished dress with a flowing tulle skirt, long blonde wavy hair cascading down her back, standing on the same snowy cobblestone street, the Eiffel Tower in the background, soft snowflakes falling around them, gentle streetlights casting a warm glow, her arms wrapped around her partner's neck, faces close together in an intimate moment, sharing a gentle smile."
102
  )
103
  man_prompt = gr.Textbox(
104
  label="Man Prompt",
105
+ value="Close-up, intimate portrait, a man wearing a crisp white button-down shirt with rolled-up sleeves, khaki pants, standing on a snowy cobblestone street, the Eiffel Tower dusted with snow in the background, soft snowflakes falling around them, gentle streetlights casting a warm glow, his hands tenderly embracing his partner's waist, looking lovingly at her with a warm smile."
106
  )
107
 
108
  batch_size = gr.Slider(minimum=1, maximum=8, value=4, step=1, label="Batch Size")
 
113
 
114
  generate_btn.click(
115
  fn=generate_paris_images,
116
+ inputs=[product_name, image1_input, image2_input, woman_prompt, man_prompt, batch_size],
117
  outputs=[image_output, time_output]
118
  )
119
 
120
+ product_name.change(
121
+ fn=change_product_preview,
122
+ inputs=[product_name],
123
+ outputs=[product_preview]
124
+ )
125
+
126
  if __name__ == "__main__":
127
  print("Starting Gradio interface...")
128
  demo.launch()
install ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ commit 2b6ec1a4293a510a2f73c119ff575a44da8c4f3d (HEAD -> main)
2
+ Author: ardha <[email protected]>
3
+ Date: Thu Jan 23 21:32:00 2025 +0700
4
+
5
+ Add Git LFS tracking for PNG files
6
+
7
+ commit b6155c888b5c6746952225c40a5774ab49fee264
8
+ Author: ardha <[email protected]>
9
+ Date: Thu Jan 23 21:30:47 2025 +0700
10
+
11
+ Add Git LFS tracking for PNG files
12
+
13
+ commit 02fe2c9997ef77026be0f5ccfdfcf21d7e7e0d56
14
+ Author: ardha <[email protected]>
15
+ Date: Thu Jan 23 21:29:55 2025 +0700
16
+
17
+ product list
test_images/clipspace-mask-4722992.png DELETED
Binary file (523 kB)
 
test_images/clipspace-mask-4736783.png DELETED
Binary file (672 kB)
 
test_images/man.png DELETED
Binary file (432 kB)
 
test_images/woman.png DELETED
Binary file (559 kB)
 
test_images/user3-f.jpg → user3-f.jpg RENAMED
File without changes
test_images/user3.jpg → user3-m.jpg RENAMED
File without changes