Zuii commited on
Commit
668f50f
Β·
verified Β·
1 Parent(s): e759702

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +63 -38
app.py CHANGED
@@ -10,21 +10,29 @@ import gradio as gr
10
 
11
  MAX_SEED = 999999
12
 
13
- # βœ… Pixelcut API key
14
- pixelcut_api_key = "sk_7c19e4f2ad434a3ebc70fdd85ade5309"
15
-
16
 
17
  # 🎯 Convert image to PNG format
18
  def convert_to_png(image):
19
  return cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
20
 
21
-
22
  # πŸ”₯ Encode image to base64 PNG format
23
  def encode_image(image):
24
  image = convert_to_png(image)
25
  _, buffer = cv2.imencode('.png', image)
26
  return base64.b64encode(buffer).decode('utf-8')
27
 
 
 
 
 
 
 
 
 
 
 
28
 
29
  # πŸš€ Main try-on function using Pixelcut API
30
  def tryon(person_img, garment_img, seed, randomize_seed):
@@ -39,70 +47,86 @@ def tryon(person_img, garment_img, seed, randomize_seed):
39
  seed = random.randint(0, MAX_SEED)
40
 
41
  # πŸ”₯ Convert images to base64 PNG
42
- encoded_person_img = encode_image(person_img)
43
- encoded_garment_img = encode_image(garment_img)
 
 
 
 
 
 
 
44
 
45
  # 🌟 Setup Pixelcut API endpoint and headers
46
  url = "https://api.developer.pixelcut.ai/v1/remove-background"
47
  headers = {
48
- "Content-Type": "application/json",
49
- "Accept": "application/json",
50
- "X-API-KEY": pixelcut_api_key
51
  }
52
 
53
- # πŸ“© Setup request payload for person image
54
  person_data = {
55
- "image_url": f"data:image/png;base64,{encoded_person_img}",
 
 
 
 
 
56
  "format": "png"
57
  }
58
 
59
  result_img = None
60
  max_retries = 5
61
- retry_delay = 5
62
 
63
  try:
64
  session = requests.Session()
65
 
66
- # πŸš€ Send person image for background removal
67
  for attempt in range(max_retries):
68
- person_response = session.post(url, headers=headers, json=person_data, timeout=60)
69
- print("Person Response:", person_response.status_code, person_response.text)
70
-
71
- # βœ… Success β€” get the result URL
72
- if person_response.status_code == 200:
73
- person_result_url = person_response.json().get("result_url", "")
74
- print("βœ… Person Success:", person_result_url)
75
-
76
- # Fetch the processed person image
77
- if person_result_url:
78
- person_img_data = requests.get(person_result_url).content
79
- person_np = np.frombuffer(person_img_data, np.uint8)
80
- result_img = cv2.imdecode(person_np, cv2.IMREAD_UNCHANGED)
81
- info = "Success"
82
  break
83
 
84
  else:
85
- # πŸ”₯ If API returns "Too many users" or other errors
86
- error_details = person_response.json().get("error", "Unknown error")
87
- print(f"Attempt {attempt + 1}/{max_retries}: Error - {error_details}")
88
- time.sleep(retry_delay)
89
- info = f"Person image error: {person_response.status_code} - {error_details}"
 
 
 
 
 
90
 
91
  else:
92
- # ❌ If retries fail
93
- info = "API still overloaded β€” please try again later."
94
 
95
- # πŸ›‘ Handle timeouts
96
  except requests.exceptions.ReadTimeout:
97
  print("Timeout!")
98
- info = "Too many users, please try again later"
99
  raise gr.Error("Too many users, please try again later")
100
 
101
- # ❗ Catch any other unexpected errors
102
  except Exception as err:
103
  print(f"❌ Other error: {err}")
104
  info = "Error, please contact the admin"
105
- result_img = None
106
 
107
  end_time = time.time()
108
  print(f"⏳ Time used: {end_time - start_time:.2f} seconds")
@@ -110,6 +134,7 @@ def tryon(person_img, garment_img, seed, randomize_seed):
110
  return result_img, seed, info
111
 
112
 
 
113
  example_path = os.path.join(os.path.dirname(__file__), 'assets')
114
 
115
  garm_list = os.listdir(os.path.join(example_path,"cloth"))
 
10
 
11
  MAX_SEED = 999999
12
 
13
+ # βœ… New Pixelcut API key
14
+ pixelcut_api_key = "YOUR_NEW_PIXELCUT_API_KEY"
 
15
 
16
  # 🎯 Convert image to PNG format
17
  def convert_to_png(image):
18
  return cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
19
 
 
20
  # πŸ”₯ Encode image to base64 PNG format
21
  def encode_image(image):
22
  image = convert_to_png(image)
23
  _, buffer = cv2.imencode('.png', image)
24
  return base64.b64encode(buffer).decode('utf-8')
25
 
26
+ # πŸ› οΈ Upload images to a temporary hosting service
27
+ def upload_image(image_data):
28
+ files = {"file": ("image.png", image_data, "image/png")}
29
+ upload_response = requests.post("https://tmpfiles.org/api/v1/upload", files=files)
30
+
31
+ if upload_response.status_code == 200:
32
+ return upload_response.json().get("data", {}).get("url", None)
33
+ else:
34
+ print("❌ Image upload failed:", upload_response.text)
35
+ return None
36
 
37
  # πŸš€ Main try-on function using Pixelcut API
38
  def tryon(person_img, garment_img, seed, randomize_seed):
 
47
  seed = random.randint(0, MAX_SEED)
48
 
49
  # πŸ”₯ Convert images to base64 PNG
50
+ _, person_encoded = cv2.imencode('.png', convert_to_png(person_img))
51
+ _, garment_encoded = cv2.imencode('.png', convert_to_png(garment_img))
52
+
53
+ # βœ… Upload person and garment images to get URLs
54
+ person_url = upload_image(person_encoded)
55
+ garment_url = upload_image(garment_encoded)
56
+
57
+ if not person_url or not garment_url:
58
+ return None, None, "Image upload failed"
59
 
60
  # 🌟 Setup Pixelcut API endpoint and headers
61
  url = "https://api.developer.pixelcut.ai/v1/remove-background"
62
  headers = {
63
+ 'Content-Type': 'application/json',
64
+ 'Accept': 'application/json',
65
+ 'X-API-KEY': pixelcut_api_key
66
  }
67
 
68
+ # πŸ”§ Use uploaded URLs in the payload
69
  person_data = {
70
+ "image_url": person_url,
71
+ "format": "png"
72
+ }
73
+
74
+ garment_data = {
75
+ "image_url": garment_url,
76
  "format": "png"
77
  }
78
 
79
  result_img = None
80
  max_retries = 5
81
+ retry_delay = 3 # Faster retries now!
82
 
83
  try:
84
  session = requests.Session()
85
 
86
+ # πŸ” Retry loop β€” smarter handling of "please try again later"
87
  for attempt in range(max_retries):
88
+ response = session.post(url, headers=headers, json=person_data, timeout=60)
89
+ print("Response code:", response.status_code)
90
+
91
+ # βœ… Success β€” process the result
92
+ if response.status_code == 200:
93
+ result_url = response.json().get('result_url', '')
94
+ print("βœ… Success:", result_url)
95
+
96
+ # Fetch the final image
97
+ if result_url:
98
+ result_img_data = requests.get(result_url).content
99
+ result_np = np.frombuffer(result_img_data, np.uint8)
100
+ result_img = cv2.imdecode(result_np, cv2.IMREAD_UNCHANGED)
101
+ info = "βœ… Success"
102
  break
103
 
104
  else:
105
+ # πŸ”₯ Handle "please try again later" or other errors
106
+ error_response = response.json().get('error', '')
107
+
108
+ if "please try again later" in error_response.lower():
109
+ print(f"Attempt {attempt + 1}/{max_retries}: API said 'please try again later'. Retrying in {retry_delay} seconds...")
110
+ time.sleep(retry_delay)
111
+ retry_delay += 2 # Exponential backoff β€” retries longer each time
112
+ else:
113
+ info = f"❌ Error: {response.status_code} - {response.text}"
114
+ break
115
 
116
  else:
117
+ # ❌ If all retries fail
118
+ info = "API still says 'please try again later' β€” waited too long."
119
 
120
+ # πŸ›‘ Handle timeouts specifically
121
  except requests.exceptions.ReadTimeout:
122
  print("Timeout!")
123
+ info = "⚑ Timeout β€” please try again later"
124
  raise gr.Error("Too many users, please try again later")
125
 
126
+ # ❗ Handle any other unexpected errors
127
  except Exception as err:
128
  print(f"❌ Other error: {err}")
129
  info = "Error, please contact the admin"
 
130
 
131
  end_time = time.time()
132
  print(f"⏳ Time used: {end_time - start_time:.2f} seconds")
 
134
  return result_img, seed, info
135
 
136
 
137
+
138
  example_path = os.path.join(os.path.dirname(__file__), 'assets')
139
 
140
  garm_list = os.listdir(os.path.join(example_path,"cloth"))