PrashanthB461 commited on
Commit
bb2c1f8
·
verified ·
1 Parent(s): 25d3043

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +60 -28
app.py CHANGED
@@ -1,3 +1,4 @@
 
1
  import cv2
2
  import numpy as np
3
  from PIL import Image
@@ -20,10 +21,10 @@ pose = mp_pose.Pose(static_image_mode=True, model_complexity=2)
20
 
21
  # Salesforce Configuration (use environment variables in production)
22
  SF_CONFIG = {
23
- "username": "your_salesforce_username@example.com",
24
- "password": "your_password",
25
- "security_token": "your_security_token",
26
- "domain": "login" # For production: "login" or "test"
27
  }
28
 
29
  class SalesforceConnector:
@@ -47,18 +48,18 @@ class SalesforceConnector:
47
  def is_connected(self):
48
  return self.sf is not None
49
 
50
- def query_dresses(self):
51
  if not self.is_connected():
52
  self.connect()
53
  if not self.is_connected():
54
  return {}
55
 
56
  try:
57
- result = self.sf.query(
58
- "SELECT Id, Name, Image_URL__c FROM Product2 "
59
- "WHERE IsActive = TRUE AND Family = 'Dress' "
60
- "LIMIT 20"
61
- )
62
  return result.get("records", [])
63
  except Exception as e:
64
  logger.error(f"Salesforce query failed: {str(e)}")
@@ -66,10 +67,10 @@ class SalesforceConnector:
66
 
67
  sf_connector = SalesforceConnector()
68
 
69
- def fetch_dresses():
70
- """Fetch dresses with automatic reconnection"""
71
  dresses = {}
72
- records = sf_connector.query_dresses()
73
 
74
  for item in records:
75
  if not item.get('Image_URL__c'):
@@ -77,11 +78,13 @@ def fetch_dresses():
77
 
78
  try:
79
  img_response = requests.get(item['Image_URL__c'], timeout=10)
 
80
  img = Image.open(BytesIO(img_response.content)).convert("RGBA")
81
  dresses[item['Id']] = {
82
  'name': item['Name'],
83
  'image': img,
84
- 'thumbnail': generate_thumbnail(img)
 
85
  }
86
  except Exception as e:
87
  logger.warning(f"Failed to load dress {item.get('Name')}: {str(e)}")
@@ -96,9 +99,18 @@ def generate_thumbnail(img, size=(150, 200)):
96
  img.save(buffered, format="PNG")
97
  return f"data:image/png;base64,{base64.b64encode(buffered.getvalue()).decode()}"
98
 
99
- # Rest of your existing functions (get_body_landmarks, warp_and_overlay, etc.)
 
 
 
 
 
 
 
 
 
100
 
101
- def process_try_on(user_image, dress_id):
102
  """Main processing with enhanced error handling"""
103
  if user_image is None:
104
  return None, "Please upload an image"
@@ -115,9 +127,9 @@ def process_try_on(user_image, dress_id):
115
  return user_image, "Stand facing camera with arms slightly away"
116
 
117
  # Get dresses
118
- dresses = fetch_dresses()
119
  if not dresses:
120
- return user_image, "No dresses available - check Salesforce connection"
121
 
122
  if dress_id not in dresses:
123
  return user_image, "Selected dress not found"
@@ -138,39 +150,59 @@ with gr.Blocks(title="Virtual Try-On", css=".thumbnail { height: 100px !importan
138
  with gr.Row():
139
  with gr.Column():
140
  input_image = gr.Image(sources=["upload", "webcam"], type="pil", label="Your Photo")
 
 
 
 
 
 
141
  with gr.Row():
142
  refresh_btn = gr.Button("🔄 Refresh Dresses")
143
  try_btn = gr.Button("👗 Try On Dress", variant="primary")
144
  dress_dropdown = gr.Dropdown(label="Select Dress", interactive=True)
145
- connection_status = gr.Textbox(label="Salesforce Status",
146
- value="Connected" if sf_connector.is_connected() else "Disconnected")
 
 
147
 
148
  with gr.Column():
149
  output_image = gr.Image(label="Your Virtual Try-On", interactive=False)
150
  status = gr.Textbox(label="Status")
151
 
152
- def update_dress_dropdown():
153
- dresses = fetch_dresses()
154
- choices = [(f"{d['name']}", id) for id, d in dresses.items()]
155
  status = "Connected" if sf_connector.is_connected() else "Disconnected"
156
  return (
157
- gr.Dropdown(choices=choices, value=choices[0][1] if choices else None),
 
 
 
 
158
  f"Salesforce: {status} | {len(choices)} dresses loaded"
159
  )
160
 
161
  refresh_btn.click(
162
- update_dress_dropdown,
 
 
 
 
 
 
 
163
  outputs=[dress_dropdown, connection_status]
164
  )
165
 
166
  try_btn.click(
167
- process_try_on,
168
- inputs=[input_image, dress_dropdown],
169
  outputs=[output_image, status]
170
  )
171
 
172
  demo.load(
173
- update_dress_dropdown,
 
174
  outputs=[dress_dropdown, connection_status]
175
  )
176
 
 
1
+ import os
2
  import cv2
3
  import numpy as np
4
  from PIL import Image
 
21
 
22
  # Salesforce Configuration (use environment variables in production)
23
  SF_CONFIG = {
24
+ "username": os.environ.get("SF_USERNAME", "virtualtryonladies493@agentforce.com"),
25
+ "password": os.environ.get("SF_PASSWORD", "virtual@tryon1"),
26
+ "security_token": os.environ.get("SF_SECURITY_TOKEN", "your_security_token"),
27
+ "domain": os.environ.get("SF_DOMAIN", "login") # For production: "login" or "test"
28
  }
29
 
30
  class SalesforceConnector:
 
48
  def is_connected(self):
49
  return self.sf is not None
50
 
51
+ def query_dresses(self, dress_type=None):
52
  if not self.is_connected():
53
  self.connect()
54
  if not self.is_connected():
55
  return {}
56
 
57
  try:
58
+ query = "SELECT Id, Name, Image_URL__c, Dress_Type__c FROM Product2 WHERE IsActive = TRUE AND Family = 'Dress'"
59
+ if dress_type:
60
+ query += f" AND Dress_Type__c = '{dress_type}'"
61
+ query += " LIMIT 20"
62
+ result = self.sf.query(query)
63
  return result.get("records", [])
64
  except Exception as e:
65
  logger.error(f"Salesforce query failed: {str(e)}")
 
67
 
68
  sf_connector = SalesforceConnector()
69
 
70
+ def fetch_dresses(dress_type=None):
71
+ """Fetch dresses with automatic reconnection, filtered by dress type"""
72
  dresses = {}
73
+ records = sf_connector.query_dresses(dress_type)
74
 
75
  for item in records:
76
  if not item.get('Image_URL__c'):
 
78
 
79
  try:
80
  img_response = requests.get(item['Image_URL__c'], timeout=10)
81
+ img_response.raise_for_status()
82
  img = Image.open(BytesIO(img_response.content)).convert("RGBA")
83
  dresses[item['Id']] = {
84
  'name': item['Name'],
85
  'image': img,
86
+ 'thumbnail': generate_thumbnail(img),
87
+ 'type': item.get('Dress_Type__c', 'Unknown')
88
  }
89
  except Exception as e:
90
  logger.warning(f"Failed to load dress {item.get('Name')}: {str(e)}")
 
99
  img.save(buffered, format="PNG")
100
  return f"data:image/png;base64,{base64.b64encode(buffered.getvalue()).decode()}"
101
 
102
+ # Placeholder for existing functions (replace with your actual implementations)
103
+ def get_body_landmarks(image):
104
+ """Placeholder for body landmark detection"""
105
+ # Replace with your actual MediaPipe-based implementation
106
+ return [] # Return list of landmarks or empty if detection fails
107
+
108
+ def warp_and_overlay(user_img, dress_img, body_pts):
109
+ """Placeholder for dress overlay logic"""
110
+ # Replace with your actual implementation
111
+ return user_img # Return processed image
112
 
113
+ def process_try_on(user_image, dress_id, dress_type):
114
  """Main processing with enhanced error handling"""
115
  if user_image is None:
116
  return None, "Please upload an image"
 
127
  return user_image, "Stand facing camera with arms slightly away"
128
 
129
  # Get dresses
130
+ dresses = fetch_dresses(dress_type)
131
  if not dresses:
132
+ return user_image, f"No {dress_type} dresses available - check Salesforce connection"
133
 
134
  if dress_id not in dresses:
135
  return user_image, "Selected dress not found"
 
150
  with gr.Row():
151
  with gr.Column():
152
  input_image = gr.Image(sources=["upload", "webcam"], type="pil", label="Your Photo")
153
+ dress_type = gr.Dropdown(
154
+ label="Select Dress Type",
155
+ choices=["Casual", "Formal"],
156
+ value="Casual",
157
+ interactive=True
158
+ )
159
  with gr.Row():
160
  refresh_btn = gr.Button("🔄 Refresh Dresses")
161
  try_btn = gr.Button("👗 Try On Dress", variant="primary")
162
  dress_dropdown = gr.Dropdown(label="Select Dress", interactive=True)
163
+ connection_status = gr.Textbox(
164
+ label="Salesforce Status",
165
+ value="Connected" if sf_connector.is_connected() else "Disconnected"
166
+ )
167
 
168
  with gr.Column():
169
  output_image = gr.Image(label="Your Virtual Try-On", interactive=False)
170
  status = gr.Textbox(label="Status")
171
 
172
+ def update_dress_dropdown(dress_type):
173
+ dresses = fetch_dresses(dress_type)
174
+ choices = [(f"{d['name']} ({d['type']})", id) for id, d in dresses.items()]
175
  status = "Connected" if sf_connector.is_connected() else "Disconnected"
176
  return (
177
+ gr.Dropdown.update(
178
+ choices=choices,
179
+ value=choices[0][1] if choices else None,
180
+ label=f"Select Dress ({len(choices)} {dress_type} dresses)"
181
+ ),
182
  f"Salesforce: {status} | {len(choices)} dresses loaded"
183
  )
184
 
185
  refresh_btn.click(
186
+ fn=update_dress_dropdown,
187
+ inputs=dress_type,
188
+ outputs=[dress_dropdown, connection_status]
189
+ )
190
+
191
+ dress_type.change(
192
+ fn=update_dress_dropdown,
193
+ inputs=dress_type,
194
  outputs=[dress_dropdown, connection_status]
195
  )
196
 
197
  try_btn.click(
198
+ fn=process_try_on,
199
+ inputs=[input_image, dress_dropdown, dress_type],
200
  outputs=[output_image, status]
201
  )
202
 
203
  demo.load(
204
+ fn=update_dress_dropdown,
205
+ inputs=dress_type,
206
  outputs=[dress_dropdown, connection_status]
207
  )
208