cloudzzl MobvxtR commited on
Commit
324c76c
·
0 Parent(s):

Duplicate from MobvxtR/MbModel

Browse files

Co-authored-by: El harmali <MobvxtR@users.noreply.huggingface.co>

Files changed (7) hide show
  1. .gitattributes +35 -0
  2. README.md +38 -0
  3. app.py +49 -0
  4. models/best.pt +3 -0
  5. requirements.txt +6 -0
  6. utils/model_loader.py +11 -0
  7. utils/preprocessing.py +36 -0
.gitattributes ADDED
@@ -0,0 +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
README.md ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: openrail
3
+ language:
4
+ - en
5
+ base_model:
6
+ - Ultralytics/YOLOv8
7
+ pipeline_tag: image-segmentation
8
+ tags:
9
+ - clothes
10
+ - instance
11
+ - segmentation
12
+ - computer
13
+ - vision
14
+ ---
15
+ ---
16
+ license: openrail
17
+ language:
18
+ - en
19
+
20
+ # Fashion Item Segmenter 🧥
21
+
22
+ This app segments clothing items from images using YOLOv8 and RemBG.
23
+
24
+ ## How to Use
25
+ 1. Upload an image of clothing.
26
+ 2. Click "Process Image".
27
+ 3. View segmented items in the gallery.
28
+
29
+ ## Example Images
30
+ - `sample1.jpg`
31
+ - `sample2.jpg`
32
+
33
+ ## Requirements
34
+ - Python 3.8+
35
+ - See `requirements.txt` for dependencies.
36
+
37
+ ## Deployment
38
+ Deployed on Hugging Face Spaces: [model](https://huggingface.co/MobvxtR/mbModelo)
app.py ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import cv2
3
+ import numpy as np
4
+ from utils.preprocessing import ImageProcessor
5
+
6
+ # Initialize processor
7
+ processor = ImageProcessor("models/best.pt")
8
+
9
+ def process_image(input_image):
10
+ if input_image is None:
11
+ raise gr.Error("Please upload an image first!")
12
+
13
+ # Convert Gradio Image to bytes
14
+ _, img_bytes = cv2.imencode(".png", input_image)
15
+
16
+ # Process image
17
+ results = processor.process_image(img_bytes.tobytes())
18
+
19
+ # Format outputs
20
+ return {
21
+ class_name: (mask * 255).astype(np.uint8)
22
+ for class_name, mask in results.items()
23
+ }
24
+
25
+ # Gradio interface
26
+ with gr.Blocks(title="Fashion Segmenter") as demo:
27
+ gr.Markdown("# 🧥 Fashion Item Segmenter")
28
+
29
+ with gr.Row():
30
+ input_image = gr.Image(label="Upload Clothing Image", type="numpy")
31
+ output_gallery = gr.Gallery(label="Segmented Items", columns=2)
32
+
33
+ with gr.Row():
34
+ run_btn = gr.Button("Process Image", variant="primary")
35
+ examples = gr.Examples(
36
+ examples=["sample1.jpg", "sample2.jpg"],
37
+ inputs=[input_image],
38
+ label="Example Images"
39
+ )
40
+
41
+ run_btn.click(
42
+ fn=process_image,
43
+ inputs=[input_image],
44
+ outputs=[output_gallery],
45
+ show_progress=True
46
+ )
47
+
48
+ if __name__ == "__main__":
49
+ demo.launch()
models/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4fb30fc987fc472b7c8b383a8a4fba7d4aa9b2bd1b2e97e0705005134edcf6b6
3
+ size 276355837
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ ultralytics==8.0.0
2
+ rembg==2.0.38
3
+ gradio>=3.36.0
4
+ opencv-python-headless==4.7.0.72
5
+ numpy==1.23.5
6
+ huggingface_hub>=0.14.0
utils/model_loader.py ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from ultralytics import YOLO
2
+ from huggingface_hub import hf_hub_download
3
+
4
+ def load_model():
5
+ # Download model from Hugging Face Hub (if hosted)
6
+ model_path = hf_hub_download(
7
+ repo_id="MobvxtR/mbModel/models"
8
+ filename="best.pt",
9
+ revision="main"
10
+ )
11
+ return YOLO(model_path)
utils/preprocessing.py ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import numpy as np
3
+ from rembg import remove
4
+ from ultralytics import YOLO
5
+
6
+ class ImageProcessor:
7
+ def __init__(self, model_path):
8
+ self.model = YOLO(model_path)
9
+ self.class_names = {0: "upper_clothes", 1: "lower_clothes"}
10
+
11
+ def remove_background(self, image_bytes):
12
+ return remove(image_bytes)
13
+
14
+ def process_image(self, image_bytes):
15
+ # Background removal
16
+ bg_removed = self.remove_background(image_bytes)
17
+
18
+ # Convert to OpenCV format
19
+ nparr = np.frombuffer(bg_removed, np.uint8)
20
+ img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
21
+
22
+ # Segmentation
23
+ results = self.model.predict(img)
24
+ return self._process_masks(results, img)
25
+
26
+ def _process_masks(self, results, img):
27
+ segmented = {}
28
+ if results[0].masks is not None:
29
+ for mask, class_id in zip(results[0].masks.data, results[0].boxes.cls):
30
+ class_id = int(class_id.item())
31
+ mask_np = mask.cpu().numpy()
32
+ mask_resized = cv2.resize(mask_np, (img.shape[1], img.shape[0]), interpolation=cv2.INTER_NEAREST)
33
+ _, binary_mask = cv2.threshold(mask_resized, 0.5, 255, cv2.THRESH_BINARY)
34
+ binary_mask = binary_mask.astype(np.uint8)
35
+ segmented[self.class_names[class_id]] = binary_mask
36
+ return segmented