ritz26 commited on
Commit
b7dd971
·
verified ·
1 Parent(s): ddc7535

Upload 7 files

Browse files
Files changed (7) hide show
  1. .dockerignore +12 -0
  2. .gitattributes +35 -35
  3. Dockerfile +49 -0
  4. README.md +10 -10
  5. app.py +87 -0
  6. requirements.txt +10 -10
  7. runtime.txt +1 -0
.dockerignore ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ __pycache__/
2
+ *.pyc
3
+ *.pyo
4
+ *.pyd
5
+ *.log
6
+ *.db
7
+ *.sqlite3
8
+ env/
9
+ venv/
10
+ .idea/
11
+ .vscode/
12
+ .git/
.gitattributes CHANGED
@@ -1,35 +1,35 @@
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
+ *.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
Dockerfile ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use official Python image
2
+ FROM python:3.10-slim
3
+
4
+ # Disable interactive prompts
5
+ ENV DEBIAN_FRONTEND=noninteractive
6
+
7
+ # Set working directory
8
+ WORKDIR /app
9
+
10
+ # Install system dependencies
11
+ RUN apt-get update && apt-get install -y \
12
+ ffmpeg \
13
+ libsm6 \
14
+ libxext6 \
15
+ git \
16
+ curl \
17
+ && rm -rf /var/lib/apt/lists/*
18
+
19
+ # Copy requirements and install Python packages
20
+ COPY requirements.txt .
21
+
22
+ # Upgrade pip first and set timeout + retries
23
+ RUN pip install --upgrade pip \
24
+ && pip config set global.timeout 100 \
25
+ && pip config set global.retries 10 \
26
+ && pip install --no-cache-dir -r requirements.txt
27
+
28
+ RUN pip install --no-cache-dir -r requirements.txt
29
+
30
+ # Set Hugging Face cache directory
31
+ ENV HF_HOME=/models
32
+ ENV TRANSFORMERS_CACHE=/models/transformers
33
+ ENV HF_DATASETS_CACHE=/models/datasets
34
+ ENV HF_METRICS_CACHE=/models/metrics
35
+
36
+ # Pre-download the SAM model from Hugging Face
37
+ RUN python -c "\
38
+ from transformers import SamModel, SamProcessor; \
39
+ SamModel.from_pretrained('Zigeng/SlimSAM-uniform-50'); \
40
+ SamProcessor.from_pretrained('Zigeng/SlimSAM-uniform-50')"
41
+
42
+ # Copy all project files
43
+ COPY . .
44
+
45
+ # Expose port for Flask
46
+ EXPOSE 6000
47
+
48
+ # Run using gunicorn
49
+ CMD ["gunicorn", "--bind", "0.0.0.0:6000", "app:app"]
README.md CHANGED
@@ -1,10 +1,10 @@
1
- ---
2
- title: Virtual Try On V2
3
- emoji: 🦀
4
- colorFrom: gray
5
- colorTo: purple
6
- sdk: docker
7
- pinned: false
8
- ---
9
-
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
+ ---
2
+ title: Virtual Try On V2
3
+ emoji: 🦀
4
+ colorFrom: gray
5
+ colorTo: purple
6
+ sdk: docker
7
+ pinned: false
8
+ ---
9
+
10
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, render_template, request
2
+ from PIL import Image
3
+ import os
4
+ import torch
5
+ import cv2
6
+ import mediapipe as mp
7
+ from transformers import SamModel, SamProcessor
8
+ from diffusers.utils import load_image
9
+
10
+ app = Flask(__name__)
11
+
12
+ UPLOAD_FOLDER = 'static/uploads'
13
+ OUTPUT_FOLDER = 'static/outputs'
14
+
15
+ # Ensure folders exist
16
+ os.makedirs(UPLOAD_FOLDER, exist_ok=True)
17
+ os.makedirs(OUTPUT_FOLDER, exist_ok=True)
18
+
19
+ # Load model once at startup
20
+ model = SamModel.from_pretrained("Zigeng/SlimSAM-uniform-50")
21
+ processor = SamProcessor.from_pretrained("Zigeng/SlimSAM-uniform-50")
22
+
23
+ # Pose function
24
+ def get_shoulder_coordinates(image_path):
25
+ mp_pose = mp.solutions.pose
26
+ pose = mp_pose.Pose()
27
+ image = cv2.imread(image_path)
28
+ if image is None:
29
+ return None
30
+ image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
31
+ results = pose.process(image_rgb)
32
+ if results.pose_landmarks:
33
+ height, width, _ = image.shape
34
+ landmarks = results.pose_landmarks.landmark
35
+ left_shoulder = (int(landmarks[11].x * width), int(landmarks[11].y * height))
36
+ right_shoulder = (int(landmarks[12].x * width), int(landmarks[12].y * height))
37
+ print(left_shoulder)
38
+ print(right_shoulder)
39
+ return left_shoulder, right_shoulder
40
+ else:
41
+ return None
42
+
43
+ @app.route('/', methods=['GET', 'POST'])
44
+ def index():
45
+ if request.method == 'POST':
46
+ person_file = request.files['person_image']
47
+ tshirt_file = request.files['tshirt_image']
48
+
49
+ person_path = os.path.join(UPLOAD_FOLDER, 'person.jpg')
50
+ tshirt_path = os.path.join(UPLOAD_FOLDER, 'tshirt.png')
51
+
52
+ person_file.save(person_path)
53
+ tshirt_file.save(tshirt_path)
54
+
55
+ # Run your model
56
+ coordinates = get_shoulder_coordinates(person_path)
57
+ if coordinates is None:
58
+ return "No pose detected."
59
+
60
+ img = load_image(person_path)
61
+ new_tshirt = load_image(tshirt_path)
62
+
63
+ left_shoulder, right_shoulder = coordinates
64
+ input_points = [[[left_shoulder[0], left_shoulder[1]], [right_shoulder[0], right_shoulder[1]]]]
65
+
66
+ inputs = processor(img, input_points=input_points, return_tensors="pt")
67
+ outputs = model(**inputs)
68
+
69
+ masks = processor.image_processor.post_process_masks(outputs.pred_masks.cpu(),
70
+ inputs["original_sizes"].cpu(),
71
+ inputs["reshaped_input_sizes"].cpu())
72
+
73
+ mask_tensor = masks[0][0][2].to(dtype=torch.uint8)
74
+ mask = transforms.ToPILImage()(mask_tensor * 255)
75
+
76
+ new_tshirt = new_tshirt.resize(img.size, Image.LANCZOS)
77
+ img_with_new_tshirt = Image.composite(new_tshirt, img, mask)
78
+
79
+ result_path = os.path.join(OUTPUT_FOLDER, 'result.jpg')
80
+ img_with_new_tshirt.save(result_path)
81
+
82
+ return render_template('index.html', result_img='outputs/result.jpg')
83
+
84
+ return render_template('index.html')
85
+
86
+ if __name__ == '__main__':
87
+ app.run(debug=True, host='0.0.0.0', port=6000)
requirements.txt CHANGED
@@ -1,10 +1,10 @@
1
- Flask
2
- gunicorn
3
- Pillow
4
- opencv-python
5
- torch
6
- torchvision
7
- mediapipe
8
- transformers
9
- diffusers
10
- safetensors
 
1
+ Flask
2
+ gunicorn
3
+ Pillow
4
+ opencv-python
5
+ torch
6
+ torchvision
7
+ mediapipe
8
+ transformers
9
+ diffusers
10
+ safetensors
runtime.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ python-3.10.12