Ubuntu commited on
Commit
cda9a4d
·
1 Parent(s): fff5254

main working commit

Browse files
.gitattributes CHANGED
@@ -1,35 +1,3 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
1
+ *.jpg filter=lfs diff=lfs merge=lfs -text
2
+ *.jpeg filter=lfs diff=lfs merge=lfs -text
3
+ *.png filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ .env
2
+ venv
app.py CHANGED
@@ -1,7 +1,260 @@
1
  import gradio as gr
 
 
 
 
 
 
 
 
 
2
 
3
- def greet(name):
4
- return "Hello " + name + "!!"
 
 
5
 
6
- demo = gr.Interface(fn=greet, inputs="text", outputs="text")
7
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import gradio as gr
2
+ import json
3
+ import base64
4
+ import requests
5
+ import time
6
+ import os
7
+ from dotenv import load_dotenv
8
+ import numpy as np
9
+ from PIL import Image
10
+ import io
11
 
12
+ # Load API key from .env file
13
+ load_dotenv()
14
+ API_KEY = os.getenv('API_KEY')
15
+ CURRENT_URL = os.getenv('CURRENT_URL')
16
 
17
+ # API endpoints
18
+ TRYON_URL = CURRENT_URL + 'api/tryon/'
19
+ FETCH_URL = CURRENT_URL + 'api/tryon_state/'
20
+
21
+ # Headers for API requests
22
+ headers = {
23
+ 'Authorization': 'Bearer ' + API_KEY,
24
+ 'Content-Type': 'application/json',
25
+ }
26
+
27
+ # Create example directories if they don't exist
28
+ os.makedirs("examples/garments", exist_ok=True)
29
+ os.makedirs("examples/persons", exist_ok=True)
30
+
31
+ # Paths to example images (you'll need to add these files)
32
+ sample_garments = [
33
+ "samples/garments/g1.jpg",
34
+ "samples/garments/g2.jpg",
35
+ ]
36
+
37
+ sample_humans = [
38
+ "samples/humans/h1.jpg",
39
+ "samples/humans/h2.jpg",
40
+
41
+ ]
42
+
43
+ def preprocess_image(img, target_size=None):
44
+ """Preprocess image without resizing if target_size is None"""
45
+ if img is None:
46
+ return None
47
+
48
+ # Convert numpy array to PIL Image if it's a numpy array
49
+ if isinstance(img, np.ndarray):
50
+ img = Image.fromarray(img.astype('uint8'))
51
+
52
+ # Only resize if target_size is specified
53
+ if target_size is not None:
54
+ img = img.resize(target_size, Image.LANCZOS)
55
+
56
+ return img
57
+
58
+ def virtual_tryon(garment_img, person_img):
59
+ # Convert images to base64
60
+ if person_img is None or garment_img is None:
61
+ return None
62
+
63
+ # Preprocess images without resizing
64
+ human_pil = preprocess_image(person_img)
65
+ garment_pil = preprocess_image(garment_img)
66
+
67
+ human_buffer = io.BytesIO()
68
+ garment_buffer = io.BytesIO()
69
+
70
+ human_pil.save(human_buffer, format="JPEG")
71
+ garment_pil.save(garment_buffer, format="JPEG")
72
+
73
+ human_base64_image = base64.b64encode(human_buffer.getvalue()).decode('utf-8')
74
+ garment_base64_image = base64.b64encode(garment_buffer.getvalue()).decode('utf-8')
75
+
76
+ # Prepare data for API request
77
+ data = {
78
+ 'human_image_base64': human_base64_image,
79
+ 'garment_image_base64': garment_base64_image,
80
+ }
81
+
82
+ # Make API request to start tryon process
83
+ response = requests.post(TRYON_URL, headers=headers, data=json.dumps(data))
84
+
85
+ if response.status_code != 200:
86
+ return None
87
+
88
+ json_response = response.json()
89
+ tryon_pk = json_response['tryon_pk']
90
+
91
+ # Poll for result
92
+ time_elapsed = 0
93
+ while time_elapsed < 60: # Timeout after 60 seconds
94
+ fetch_response = requests.post(FETCH_URL, headers=headers, data=json.dumps({
95
+ 'tryon_pk': tryon_pk,
96
+ }))
97
+
98
+ if fetch_response.status_code != 200:
99
+ return None
100
+
101
+ json_response = fetch_response.json()
102
+
103
+ if json_response.get('message') != 'success':
104
+ return None
105
+
106
+ if json_response.get('status') == 'done':
107
+ # Download the result image
108
+ result_url = json_response['s3_url']
109
+ img_response = requests.get(result_url)
110
+ if img_response.status_code == 200:
111
+ return Image.open(io.BytesIO(img_response.content))
112
+
113
+ time.sleep(2)
114
+ time_elapsed += 2
115
+
116
+ return None
117
+
118
+ custom_css = """
119
+ body, .gradio-container {
120
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
121
+ background-color: #121212;
122
+ color: white;
123
+ }
124
+
125
+ h1, h2, h3 {
126
+ color: white !important;
127
+ }
128
+
129
+ .container {
130
+ max-width: 1200px;
131
+ margin: 0 auto;
132
+ }
133
+
134
+ .image-container img {
135
+ object-fit: contain;
136
+ max-height: 450px;
137
+ width: auto;
138
+ margin: 0 auto;
139
+ display: block;
140
+ border-radius: 8px;
141
+ }
142
+
143
+ .examples-container {
144
+ display: grid;
145
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
146
+ gap: 10px;
147
+ margin-top: 10px;
148
+ }
149
+
150
+ .examples-container img {
151
+ height: 120px;
152
+ object-fit: cover;
153
+ border-radius: 8px;
154
+ cursor: pointer;
155
+ transition: transform 0.2s;
156
+ }
157
+
158
+ .examples-container img:hover {
159
+ transform: scale(1.05);
160
+ }
161
+
162
+ button#try-on-button {
163
+ background-color: #FF6B00 !important;
164
+ color: white !important;
165
+ border: none !important;
166
+ padding: 12px 20px !important;
167
+ font-weight: 600 !important;
168
+ border-radius: 8px !important;
169
+ cursor: pointer !important;
170
+ transition: background-color 0.3s !important;
171
+ }
172
+
173
+ button#try-on-button:hover {
174
+ background-color: #FF8C33 !important;
175
+ }
176
+
177
+ footer {visibility: hidden}
178
+ """
179
+
180
+ # Create Gradio interface
181
+ with gr.Blocks(theme=gr.themes.Base(), css=custom_css) as demo:
182
+ gr.HTML("<h1 style='text-align: center; margin-bottom: 20px;'>AlphaBakeVirtual Try-On</h1>")
183
+
184
+ with gr.Row():
185
+ # First column - Garment
186
+ with gr.Column(scale=1):
187
+ gr.Markdown("### Garment Image")
188
+ garment_input = gr.Image(
189
+ label="Upload a garment image",
190
+ type="pil",
191
+ elem_id="garment-image",
192
+ elem_classes=["image-container"],
193
+ height=350
194
+ )
195
+
196
+ # Add example garment images
197
+ gr.Examples(
198
+ examples=sample_garments,
199
+ inputs=garment_input,
200
+ label="Garment Examples",
201
+ examples_per_page=4
202
+ )
203
+
204
+ # Second column - Person
205
+ with gr.Column(scale=1):
206
+ gr.Markdown("### Person Image")
207
+ person_input = gr.Image(
208
+ label="Upload a person image",
209
+ type="pil",
210
+ elem_id="person-image",
211
+ elem_classes=["image-container"],
212
+ height=350
213
+ )
214
+
215
+ # Add example person images
216
+ gr.Examples(
217
+ examples=sample_humans,
218
+ inputs=person_input,
219
+ label="Person Examples",
220
+ examples_per_page=4
221
+ )
222
+
223
+ # Third column - Garment options & result
224
+ with gr.Column(scale=1):
225
+
226
+ # Try-on button
227
+ try_on_button = gr.Button("Try On", elem_id="try-on-button", variant="primary", size="lg")
228
+
229
+ # Result image
230
+ output_image = gr.Image(
231
+ label="Result",
232
+ type="pil",
233
+ elem_classes=["result-image"],
234
+ height=400
235
+ )
236
+
237
+
238
+ # Validation function
239
+ def validate_inputs(garment_img, person_img, garment_type, sleeve_length, garment_length):
240
+ if garment_img is None:
241
+ raise gr.Error("Please upload a garment image")
242
+ if person_img is None:
243
+ raise gr.Error("Please upload a person image")
244
+
245
+ # If all validations pass, proceed with try-on
246
+ try:
247
+ result = virtual_tryon(garment_img, person_img)
248
+ return result
249
+ except Exception as e:
250
+ raise gr.Error(f"Error: {str(e)}")
251
+
252
+ # Connect button to validation and try-on functions
253
+ try_on_button.click(
254
+ fn=validate_inputs,
255
+ inputs=[garment_input, person_input],
256
+ outputs=output_image
257
+ )
258
+
259
+ if __name__ == "__main__":
260
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ gradio
2
+ python-dotenv
3
+ requests
4
+ numpy
5
+ pillow
samples/garments/g1.jpg ADDED

Git LFS Details

  • SHA256: a5c9aee5ea86e1b8a8ad21f3229710728904e7be583aa1c6b5d7d25443826009
  • Pointer size: 131 Bytes
  • Size of remote file: 183 kB
samples/garments/g2.jpg ADDED

Git LFS Details

  • SHA256: 718ebf0109ba929558bb9f8b4a07b8c7084ebc509bc7315e8f1b9f2cc755f398
  • Pointer size: 131 Bytes
  • Size of remote file: 233 kB
samples/humans/h1.jpg ADDED

Git LFS Details

  • SHA256: fd1b2218691c1bfac2b4c3e9ed917b26eff932b9a75f6e64a3db16fd417ac02d
  • Pointer size: 131 Bytes
  • Size of remote file: 818 kB
samples/humans/h2.jpg ADDED

Git LFS Details

  • SHA256: 0f290739b5d6bd920ba70ec0ddf78d86c025bb0c90e96fe99e5b28e06abea452
  • Pointer size: 131 Bytes
  • Size of remote file: 795 kB