Dell commited on
Commit
8e4d005
·
1 Parent(s): 8511c64
.history/CatVTON/requirements_20260617233611.txt ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ torch==2.6.0
2
+ torchvision==0.21.0
3
+ accelerate>=0.33.0
4
+ git+https://github.com/huggingface/diffusers.git
5
+ matplotlib==3.8.4
6
+ numpy==1.26.4
7
+ opencv-python-headless==4.10.0.84
8
+ Pillow==11.0.0
9
+ PyYAML==6.0.1
10
+ scipy==1.16.2
11
+ setuptools==51.0.0
12
+ scikit-image==0.24.0
13
+ tqdm==4.66.4
14
+ transformers>=4.49.0,<5.0
15
+ fvcore==0.1.5.post20221221
16
+ cloudpickle==3.0.0
17
+ omegaconf==2.3.0
18
+ pycocotools==2.0.8
19
+
20
+ # Needed by DensePose video dataset loaders (imported as `import av`)
21
+ av==13.1.0
22
+
23
+ peft>=0.17.0
24
+ huggingface_hub>=0.34.0,<2.0
25
+
.history/app_20260617233432.py ADDED
@@ -0,0 +1,403 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import sys
5
+ from dataclasses import dataclass, field
6
+ from pathlib import Path
7
+ from typing import Optional
8
+
9
+ import gradio as gr
10
+ import numpy as np
11
+ import torch
12
+ from diffusers.image_processor import VaeImageProcessor
13
+ from huggingface_hub import snapshot_download
14
+ from PIL import Image, ImageOps
15
+
16
+ # Functions used by runtime.load()/run(); implemented in CatVTON/utils.py.
17
+ # The runtime sys.path injection makes `CatVTON/utils.py` importable as `utils`.
18
+ from utils import init_weight_dtype, resize_and_crop, resize_and_padding
19
+
20
+ APP_TITLE = "ChitraTech Virtual Try-On"
21
+ APP_DESCRIPTION = (
22
+ "Upload a shopper photo and clothing image to run on-demand CatVTON virtual try-on inference "
23
+ "using the Zheng-Chong CatVTON implementation."
24
+ )
25
+ CATVTON_REPO_DIR_ENV = os.getenv("CATVTON_REPO_DIR")
26
+ CATVTON_REPO_DIR = Path(CATVTON_REPO_DIR_ENV) if CATVTON_REPO_DIR_ENV else Path("./CatVTON")
27
+ CATVTON_RESUME_PATH = os.getenv("CATVTON_RESUME_PATH", "zhengchong/CatVTON")
28
+
29
+
30
+ def resolve_catvton_repo_dir(start_dir: Path) -> Path:
31
+ """Find the CatVTON repo root that contains `model/cloth_masker.py`.
32
+
33
+ HF Spaces sometimes mount code in unexpected places; relying on fixed paths like
34
+ `/app/CatVTON` can be wrong. We therefore:
35
+ 1) try a few common candidates
36
+ 2) then scan under `/app` (and `/workspace` if present) for `model/cloth_masker.py`
37
+ """
38
+
39
+ def looks_like_repo_dir(p: Path) -> bool:
40
+ return (p / "model" / "cloth_masker.py").exists() and (p / "model" / "pipeline.py").exists()
41
+
42
+ candidates: list[Path] = []
43
+
44
+ if start_dir is not None:
45
+ candidates.append(start_dir)
46
+
47
+ if CATVTON_REPO_DIR_ENV:
48
+ candidates.append(Path(CATVTON_REPO_DIR_ENV))
49
+
50
+ candidates.extend([
51
+ Path("/app/CatVTON"),
52
+ Path("/app"),
53
+ Path("./CatVTON"),
54
+ Path("./"),
55
+ Path("/workspace"),
56
+ ])
57
+
58
+ for c in candidates:
59
+ if c is not None and looks_like_repo_dir(c):
60
+ return c.resolve()
61
+
62
+ # Broad scan for the actual code root.
63
+ scan_roots = [Path("/app"), Path("/workspace")]
64
+ for root in scan_roots:
65
+ if not root.exists():
66
+ continue
67
+ for cloth_masker in root.rglob("model/cloth_masker.py"):
68
+ repo_root = cloth_masker.parent.parent # .../<repo_root>/model/cloth_masker.py
69
+ if looks_like_repo_dir(repo_root):
70
+ return repo_root.resolve()
71
+
72
+ # Fallback: return the provided start_dir (so error message includes candidates).
73
+ return start_dir.resolve()
74
+
75
+
76
+ CATVTON_BASE_MODEL = os.getenv("CATVTON_BASE_MODEL", "booksforcharlie/stable-diffusion-inpainting")
77
+ CATVTON_OUTPUT_DIR = Path(os.getenv("CATVTON_OUTPUT_DIR", "./outputs"))
78
+ DEVICE = os.getenv("CATVTON_DEVICE", "cuda")
79
+ DEFAULT_WIDTH = int(os.getenv("CATVTON_WIDTH", "768"))
80
+ DEFAULT_HEIGHT = int(os.getenv("CATVTON_HEIGHT", "1024"))
81
+ DEFAULT_STEPS = int(os.getenv("CATVTON_STEPS", "50"))
82
+ DEFAULT_GUIDANCE_SCALE = float(os.getenv("CATVTON_GUIDANCE_SCALE", "2.5"))
83
+ DEFAULT_MIXED_PRECISION = os.getenv("CATVTON_MIXED_PRECISION", "bf16")
84
+ DEFAULT_SEED = int(os.getenv("CATVTON_SEED", "42"))
85
+
86
+
87
+ @dataclass
88
+ class CatVTONRuntime:
89
+ repo_dir: Path
90
+ device: str
91
+ pipeline: object | None = field(default=None, init=False, repr=False)
92
+ automasker: object | None = field(default=None, init=False, repr=False)
93
+ mask_processor: object | None = field(default=None, init=False, repr=False)
94
+ resize_and_crop: object | None = field(default=None, init=False, repr=False)
95
+ resize_and_padding: object | None = field(default=None, init=False, repr=False)
96
+ vis_mask: object | None = field(default=None, init=False, repr=False)
97
+ ready: bool = False
98
+ status: str = "not loaded"
99
+
100
+ def load(self) -> None:
101
+ if self.ready:
102
+ return
103
+
104
+ # Help debug missing code/weights on HF Spaces.
105
+ # (This will show up in Space logs during first request/build.)
106
+ # NOTE: keep as lightweight prints.
107
+ print("[CatVTON] load(): repo_dir=", self.repo_dir)
108
+ print("[CatVTON] CATVTON_RESUME_PATH=", CATVTON_RESUME_PATH)
109
+ print("[CatVTON] CATVTON_MODEL_DIR=", os.getenv("CATVTON_MODEL_DIR"))
110
+
111
+
112
+ if not self.repo_dir.exists():
113
+ raise RuntimeError(f"CatVTON repository not found at '{self.repo_dir}'.")
114
+
115
+ # --- Resolve real python root that contains `model/` ---
116
+ # Some HF environments mount the code differently; env/debug values can be wrong.
117
+ # We therefore detect the repo root by searching for `model/cloth_masker.py`.
118
+
119
+ # Force importability in HF Spaces: repo root is typically the working directory.
120
+ # Ensure both repo root and repo_root/CatVTON are importable.
121
+ repo_root = Path.cwd().resolve()
122
+ # Ensure that imports like `import model.*` work in HF.
123
+ # Different Space layouts may put the actual CatVTON code under:
124
+ # - ./CatVTON/model/...
125
+ # - ./model/...
126
+ # - /app/CatVTON/model/...
127
+ candidate_code_roots = [
128
+ repo_root,
129
+ repo_root / "CatVTON",
130
+ self.repo_dir,
131
+ self.repo_dir / "CatVTON",
132
+ ]
133
+ for p in candidate_code_roots:
134
+ ps = str(p)
135
+ if ps not in sys.path and p.exists():
136
+ sys.path.insert(0, ps)
137
+
138
+ # Also add the directory that directly contains `model/` if present.
139
+ direct_model_root = None
140
+ for p in candidate_code_roots:
141
+ if (p / "model" / "cloth_masker.py").exists():
142
+ direct_model_root = p
143
+ break
144
+ if direct_model_root is not None:
145
+ dm = str(direct_model_root)
146
+ if dm not in sys.path:
147
+ sys.path.insert(0, dm)
148
+
149
+
150
+ found_model_parent: Path | None = None
151
+
152
+ # Search for CatVTON's `model/` package starting from the working directory.
153
+ # (Avoid scanning large absolute paths like /app that may not exist in the container.)
154
+ for cloth_masker in repo_root.rglob("model/cloth_masker.py"):
155
+ candidate_root = cloth_masker.parent.parent # .../<repo_root>/model/cloth_masker.py
156
+ if (candidate_root / "model" / "pipeline.py").exists():
157
+ found_model_parent = candidate_root.resolve()
158
+ break
159
+
160
+ if found_model_parent is None:
161
+ # Keep existing behavior as last resort.
162
+ found_model_parent = self.repo_dir.resolve()
163
+
164
+ repo_path = str(found_model_parent)
165
+ if repo_path not in sys.path:
166
+ sys.path.insert(0, repo_path)
167
+
168
+ self.repo_dir = found_model_parent
169
+
170
+ # If CatVTON code is under `<repo_root>/CatVTON/` then `import model.*` expects
171
+ # `sys.path` to include that inner code root (so `model/` is importable).
172
+ # Ensure this regardless of which candidate_root was selected.
173
+ inner_code_root = repo_root / "CatVTON"
174
+ if (inner_code_root / "model" / "cloth_masker.py").exists():
175
+ sys.path.insert(0, str(inner_code_root.resolve()))
176
+ else:
177
+ # If the HF Space layout is different, fall back to adding `repo_root/model`.
178
+ fallback_model_root = repo_root / "model"
179
+ if (fallback_model_root / "cloth_masker.py").exists():
180
+ sys.path.insert(0, str(fallback_model_root.resolve().parent))
181
+
182
+
183
+
184
+
185
+
186
+
187
+ # If this still fails inside HF, add debugging info.
188
+ try:
189
+ from model.cloth_masker import AutoMasker, vis_mask
190
+ from model.pipeline import CatVTONPipeline
191
+ except Exception as import_exc:
192
+ # Helpful diagnostics for HF Spaces.
193
+ repo_model_exists = (self.repo_dir / "model").exists()
194
+ candidate_roots = [
195
+ self.repo_dir,
196
+ self.repo_dir / "model",
197
+ (self.repo_dir / "model").parent,
198
+ ]
199
+ candidate_roots_str = ", ".join(str(p) for p in candidate_roots)
200
+
201
+ raise RuntimeError(
202
+ "CatVTON import failed. "
203
+ f"repo_dir={self.repo_dir} "
204
+ f"repo_dir/model_exists={repo_model_exists} "
205
+ f"repo_model_candidate_roots={candidate_roots_str} "
206
+ f"sys.path[0:10]={sys.path[:10]} "
207
+ f"import_error={import_exc}"
208
+ ) from import_exc
209
+
210
+
211
+ repo_weights_dir = Path(snapshot_download(repo_id=CATVTON_RESUME_PATH))
212
+ self.pipeline = CatVTONPipeline(
213
+ base_ckpt=CATVTON_BASE_MODEL,
214
+ attn_ckpt=str(repo_weights_dir),
215
+ attn_ckpt_version="mix",
216
+ weight_dtype=init_weight_dtype(DEFAULT_MIXED_PRECISION),
217
+ use_tf32=True,
218
+ device=self.device,
219
+ )
220
+ self.mask_processor = VaeImageProcessor(
221
+ vae_scale_factor=8,
222
+ do_normalize=False,
223
+ do_binarize=True,
224
+ do_convert_grayscale=True,
225
+ )
226
+ self.automasker = AutoMasker(
227
+ densepose_ckpt=os.path.join(repo_weights_dir, "DensePose"),
228
+ schp_ckpt=os.path.join(repo_weights_dir, "SCHP"),
229
+ device=self.device,
230
+ )
231
+ self.resize_and_crop = resize_and_crop
232
+ self.resize_and_padding = resize_and_padding
233
+ self.vis_mask = vis_mask
234
+ CATVTON_OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
235
+ self.ready = True
236
+ self.status = "loaded"
237
+
238
+ def run(
239
+ self,
240
+ person_image: Image.Image,
241
+ garment_image: Image.Image,
242
+ cloth_type: str,
243
+ num_inference_steps: int,
244
+ guidance_scale: float,
245
+ seed: int,
246
+ show_type: str,
247
+ ) -> Image.Image:
248
+ self.load()
249
+ assert self.pipeline is not None
250
+ assert self.automasker is not None
251
+ assert self.mask_processor is not None
252
+ assert self.resize_and_crop is not None
253
+ assert self.resize_and_padding is not None
254
+ assert self.vis_mask is not None
255
+
256
+ person_image = self.resize_and_crop(person_image.convert("RGB"), (DEFAULT_WIDTH, DEFAULT_HEIGHT))
257
+ garment_image = self.resize_and_padding(garment_image.convert("RGB"), (DEFAULT_WIDTH, DEFAULT_HEIGHT))
258
+
259
+ generated_mask = self.automasker(person_image, cloth_type)["mask"]
260
+ generated_mask = self.mask_processor.blur(generated_mask, blur_factor=9)
261
+
262
+ generator = None
263
+ if seed != -1:
264
+ generator = torch.Generator(device=self.device).manual_seed(seed)
265
+
266
+ result_image = self.pipeline(
267
+ image=person_image,
268
+ condition_image=garment_image,
269
+ mask=generated_mask,
270
+ num_inference_steps=num_inference_steps,
271
+ guidance_scale=guidance_scale,
272
+ generator=generator,
273
+ )[0]
274
+
275
+ if show_type == "result only":
276
+ return result_image.convert("RGB")
277
+
278
+ masked_person = self.vis_mask(person_image, generated_mask)
279
+ return compose_preview(person_image, garment_image, masked_person, result_image, show_type)
280
+
281
+
282
+ runtime = CatVTONRuntime(repo_dir=resolve_catvton_repo_dir(CATVTON_REPO_DIR), device=DEVICE)
283
+
284
+
285
+
286
+ def prepare_image(image: Image.Image) -> Image.Image:
287
+ return ImageOps.exif_transpose(image).convert("RGB")
288
+
289
+
290
+ def image_grid(images: list[Image.Image], rows: int, cols: int) -> Image.Image:
291
+ if len(images) != rows * cols:
292
+ raise ValueError("The number of images does not match the grid shape.")
293
+ width, height = images[0].size
294
+ grid = Image.new("RGB", size=(cols * width, rows * height))
295
+ for index, image in enumerate(images):
296
+ grid.paste(image, box=(index % cols * width, index // cols * height))
297
+ return grid
298
+
299
+
300
+ def compose_preview(
301
+ person_image: Image.Image,
302
+ garment_image: Image.Image,
303
+ masked_person: Image.Image,
304
+ result_image: Image.Image,
305
+ show_type: str,
306
+ ) -> Image.Image:
307
+ width, height = person_image.size
308
+ if show_type == "input & result":
309
+ side_panel = image_grid([person_image, garment_image], 2, 1).resize((width // 2, height), Image.NEAREST)
310
+ else:
311
+ side_panel = image_grid([person_image, masked_person, garment_image], 3, 1).resize((width // 3, height), Image.NEAREST)
312
+
313
+ preview = Image.new("RGB", (side_panel.width + 5 + width, height), color=(255, 255, 255))
314
+ preview.paste(side_panel, (0, 0))
315
+ preview.paste(result_image.convert("RGB"), (side_panel.width + 5, 0))
316
+ return preview
317
+
318
+
319
+ def try_on(
320
+ person_image: Optional[Image.Image],
321
+ garment_image: Optional[Image.Image],
322
+ cloth_type: str,
323
+ num_inference_steps: int,
324
+ guidance_scale: float,
325
+ seed: int,
326
+ show_type: str,
327
+ ) -> Image.Image:
328
+ if person_image is None or garment_image is None:
329
+ raise gr.Error("Please upload both a shopper photo and a clothing image.")
330
+
331
+ prepared_person = prepare_image(person_image)
332
+ prepared_garment = prepare_image(garment_image)
333
+
334
+ try:
335
+ return runtime.run(
336
+ person_image=prepared_person,
337
+ garment_image=prepared_garment,
338
+ cloth_type=cloth_type,
339
+ num_inference_steps=num_inference_steps,
340
+ guidance_scale=guidance_scale,
341
+ seed=seed,
342
+ show_type=show_type,
343
+ )
344
+ except Exception as exc:
345
+ raise gr.Error(f"CatVTON inference failed: {exc}") from exc
346
+
347
+
348
+ if __name__ == "__main__":
349
+ # HF debugging: confirm CatVTON code presence inside container
350
+ _p1 = Path('/app/CatVTON/model/cloth_masker.py')
351
+ _p2 = Path('/app/CatVTON/model/pipeline.py')
352
+ _p3 = Path('./CatVTON/model/cloth_masker.py')
353
+ print('[HF Debug] /app/CatVTON/model/cloth_masker.py exists:', _p1.exists())
354
+ print('[HF Debug] /app/CatVTON/model/pipeline.py exists:', _p2.exists())
355
+ print('[HF Debug] ./CatVTON/model/cloth_masker.py exists:', _p3.exists())
356
+
357
+ with gr.Blocks(theme=gr.themes.Soft(), title=APP_TITLE) as demo:
358
+
359
+ gr.Markdown(f"# {APP_TITLE}")
360
+ gr.Markdown(APP_DESCRIPTION)
361
+ gr.Markdown(
362
+ f"**Runtime:** repo=`{CATVTON_REPO_DIR}` | weights=`{CATVTON_RESUME_PATH}` | device=`{DEVICE}`"
363
+ )
364
+
365
+ with gr.Row():
366
+ with gr.Column(scale=1):
367
+ person_input = gr.Image(type="pil", label="Shopper photo")
368
+ garment_input = gr.Image(type="pil", label="Clothing image")
369
+ cloth_type_input = gr.Radio(
370
+ label="Garment type",
371
+ choices=["upper", "lower", "overall"],
372
+ value="upper",
373
+ )
374
+ submit_button = gr.Button("Try On", variant="primary")
375
+ with gr.Accordion("Advanced options", open=False):
376
+ step_input = gr.Slider(label="Inference steps", minimum=10, maximum=100, step=5, value=DEFAULT_STEPS)
377
+ guidance_input = gr.Slider(label="Guidance scale", minimum=0.0, maximum=7.5, step=0.5, value=DEFAULT_GUIDANCE_SCALE)
378
+ seed_input = gr.Slider(label="Seed", minimum=-1, maximum=10000, step=1, value=DEFAULT_SEED)
379
+ show_type_input = gr.Radio(
380
+ label="Preview mode",
381
+ choices=["result only", "input & result", "input & mask & result"],
382
+ value="result only",
383
+ )
384
+ with gr.Column(scale=1):
385
+ result_output = gr.Image(type="pil", label="Try-on result")
386
+
387
+ gr.Markdown(
388
+ """
389
+ ### Notes
390
+ - This app is just for testing `CatVTON/` codebase.
391
+ - Model weights are downloaded on demand from Hugging Face using `zhengchong/CatVTON` by default.
392
+ - Just for testing purposes only.
393
+ """
394
+ )
395
+
396
+ submit_button.click(
397
+ fn=try_on,
398
+ inputs=[person_input, garment_input, cloth_type_input, step_input, guidance_input, seed_input, show_type_input],
399
+ outputs=result_output,
400
+ )
401
+
402
+
403
+ demo.queue().launch(show_error=True)
.history/requirements_20260617233559.txt ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ torch==2.6.0
2
+ torchvision==0.21.0
3
+ accelerate>=0.33.0
4
+ git+https://github.com/huggingface/diffusers.git
5
+ matplotlib==3.8.4
6
+ numpy==1.26.4
7
+ opencv-python-headless==4.10.0.84
8
+ Pillow==11.0.0
9
+ PyYAML==6.0.1
10
+ scipy==1.16.2
11
+ setuptools==51.0.0
12
+ scikit-image==0.24.0
13
+ tqdm==4.66.4
14
+ transformers>=4.49.0,<5.0
15
+ fvcore==0.1.5.post20221221
16
+ cloudpickle==3.0.0
17
+ omegaconf==2.3.0
18
+ pycocotools==2.0.8
19
+
20
+
21
+ peft>=0.17.0
22
+ huggingface_hub>=0.34.0,<2.0
23
+ safetensors>=0.4.3
24
+
25
+ # Needed by DensePose video dataset loaders
26
+ # (imported as `import av`)
27
+ av==13.1.0
28
+
CatVTON/requirements.txt CHANGED
@@ -11,7 +11,7 @@ scipy==1.16.2
11
  setuptools==51.0.0
12
  scikit-image==0.24.0
13
  tqdm==4.66.4
14
- transformers==4.46.3
15
  fvcore==0.1.5.post20221221
16
  cloudpickle==3.0.0
17
  omegaconf==2.3.0
 
11
  setuptools==51.0.0
12
  scikit-image==0.24.0
13
  tqdm==4.66.4
14
+ transformers>=4.49.0,<5.0
15
  fvcore==0.1.5.post20221221
16
  cloudpickle==3.0.0
17
  omegaconf==2.3.0
app.py CHANGED
@@ -13,6 +13,10 @@ from diffusers.image_processor import VaeImageProcessor
13
  from huggingface_hub import snapshot_download
14
  from PIL import Image, ImageOps
15
 
 
 
 
 
16
  APP_TITLE = "ChitraTech Virtual Try-On"
17
  APP_DESCRIPTION = (
18
  "Upload a shopper photo and clothing image to run on-demand CatVTON virtual try-on inference "
 
13
  from huggingface_hub import snapshot_download
14
  from PIL import Image, ImageOps
15
 
16
+ # Functions used by runtime.load()/run(); implemented in CatVTON/utils.py.
17
+ # The runtime sys.path injection makes `CatVTON/utils.py` importable as `utils`.
18
+ from utils import init_weight_dtype, resize_and_crop, resize_and_padding
19
+
20
  APP_TITLE = "ChitraTech Virtual Try-On"
21
  APP_DESCRIPTION = (
22
  "Upload a shopper photo and clothing image to run on-demand CatVTON virtual try-on inference "
requirements.txt CHANGED
@@ -11,7 +11,7 @@ scipy==1.16.2
11
  setuptools==51.0.0
12
  scikit-image==0.24.0
13
  tqdm==4.66.4
14
- transformers==4.46.3
15
  fvcore==0.1.5.post20221221
16
  cloudpickle==3.0.0
17
  omegaconf==2.3.0
 
11
  setuptools==51.0.0
12
  scikit-image==0.24.0
13
  tqdm==4.66.4
14
+ transformers>=4.49.0,<5.0
15
  fvcore==0.1.5.post20221221
16
  cloudpickle==3.0.0
17
  omegaconf==2.3.0