Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -5,13 +5,23 @@ import torch
|
|
5 |
import torch.nn.functional as F
|
6 |
import numpy as np
|
7 |
import cv2 as cv
|
|
|
|
|
8 |
|
9 |
-
# Model ve işlemci yükleme
|
10 |
processor = SegformerImageProcessor.from_pretrained("mattmdjaga/segformer_b2_clothes")
|
11 |
model = AutoModelForSemanticSegmentation.from_pretrained("mattmdjaga/segformer_b2_clothes")
|
12 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
|
14 |
-
def
|
|
|
|
|
15 |
|
16 |
inputs = processor(images=image, return_tensors="pt")
|
17 |
|
@@ -23,50 +33,38 @@ def change_hair_color(image, selected_color):
|
|
23 |
# Çıktıyı orijinal görüntü boyutuna göre yeniden boyutlandırın
|
24 |
upsampled_logits = F.interpolate(
|
25 |
logits,
|
26 |
-
size=image.size[::-1],
|
27 |
mode="bilinear",
|
28 |
align_corners=False,
|
29 |
)
|
30 |
|
31 |
-
|
32 |
pred_seg = upsampled_logits.argmax(dim=1)[0].numpy()
|
33 |
|
34 |
-
|
35 |
-
hair_mask = (pred_seg == 2 ).astype(np.uint8)
|
36 |
|
37 |
-
# Orijinal görüntüyü OpenCV formatına dönüştürün
|
38 |
image_cv = cv.cvtColor(np.array(image), cv.COLOR_RGB2BGR)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
|
40 |
-
# Renk kanallarını ayırın
|
41 |
-
b, g, r = cv.split(image_cv)
|
42 |
-
|
43 |
-
# Farklı renk filtreleri uygulayın
|
44 |
-
yesil_sac = cv.merge([b, r, g]) # Kırmızıyı yeşile kaydır
|
45 |
-
mavi_sac = cv.merge([r, g, b]) # Kırmızı ve mavi yer değiştir
|
46 |
-
sari_sac = cv.merge([b, r, r]) # Mavi kanalı azaltarak sarıya kaydır
|
47 |
-
mor_sac = cv.merge([r, g, r]) # Yeşili azaltarak mora kaydır
|
48 |
-
|
49 |
-
# Seçilen renge göre filtreyi uygula
|
50 |
-
if selected_color == "Green":
|
51 |
-
final_image = cv.addWeighted(image_cv, 1, cv.bitwise_and(yesil_sac, yesil_sac, mask=hair_mask), 1, 0)
|
52 |
-
elif selected_color == "Blue":
|
53 |
-
final_image = cv.addWeighted(image_cv, 1, cv.bitwise_and(mavi_sac, mavi_sac, mask=hair_mask), 1, 0)
|
54 |
-
elif selected_color == "Yellow":
|
55 |
-
final_image = cv.addWeighted(image_cv, 1, cv.bitwise_and(sari_sac, sari_sac, mask=hair_mask), 1, 0)
|
56 |
-
elif selected_color == "Purple":
|
57 |
-
|
58 |
-
final_image = cv.addWeighted(image_cv, 1, cv.bitwise_and(mor_sac, mor_sac, mask=hair_mask), 1, 0)
|
59 |
-
else:
|
60 |
-
final_image = image_cv # Orijinal renk
|
61 |
-
|
62 |
-
# Çıktıyı RGB formatında dönüştür
|
63 |
-
final_image_rgb = cv.cvtColor(final_image, cv.COLOR_BGR2RGB)
|
64 |
|
65 |
-
|
|
|
|
|
|
|
|
|
66 |
|
67 |
-
# Gradio arayüzü
|
68 |
iface = gr.Interface(
|
69 |
-
fn=
|
70 |
inputs=[
|
71 |
gr.Image(type="pil"),
|
72 |
gr.Dropdown(
|
|
|
5 |
import torch.nn.functional as F
|
6 |
import numpy as np
|
7 |
import cv2 as cv
|
8 |
+
import matplotlib.pyplot as plt
|
9 |
+
|
10 |
|
|
|
11 |
processor = SegformerImageProcessor.from_pretrained("mattmdjaga/segformer_b2_clothes")
|
12 |
model = AutoModelForSemanticSegmentation.from_pretrained("mattmdjaga/segformer_b2_clothes")
|
13 |
|
14 |
+
# Renk tonlarını belirleyin (HSV'deki hue değerleri 0-180 arasında değişir)
|
15 |
+
color_map = {
|
16 |
+
"Green": 60,
|
17 |
+
"Blue": 120,
|
18 |
+
"Yellow": 30,
|
19 |
+
"Purple": 150
|
20 |
+
}
|
21 |
|
22 |
+
def apply_filter(image, selected_color):
|
23 |
+
|
24 |
+
image = image.convert("RGB")
|
25 |
|
26 |
inputs = processor(images=image, return_tensors="pt")
|
27 |
|
|
|
33 |
# Çıktıyı orijinal görüntü boyutuna göre yeniden boyutlandırın
|
34 |
upsampled_logits = F.interpolate(
|
35 |
logits,
|
36 |
+
size=image.size[::-1],
|
37 |
mode="bilinear",
|
38 |
align_corners=False,
|
39 |
)
|
40 |
|
41 |
+
|
42 |
pred_seg = upsampled_logits.argmax(dim=1)[0].numpy()
|
43 |
|
44 |
+
hair_mask = (pred_seg == 2).astype(np.uint8)
|
|
|
45 |
|
46 |
+
# Orijinal görüntüyü OpenCV formatına dönüştürün ve HSV uzayına çevirin
|
47 |
image_cv = cv.cvtColor(np.array(image), cv.COLOR_RGB2BGR)
|
48 |
+
hsv_image = cv.cvtColor(image_cv, cv.COLOR_BGR2HSV)
|
49 |
+
|
50 |
+
# Seçilen renk için hue değeri alın
|
51 |
+
hue_value = color_map.get(selected_color, 0) # Varsayılan olarak 0 (orijinal renk tonu)
|
52 |
+
|
53 |
+
# Maske ile sadece saç bölgesini güncelleyin
|
54 |
+
hsv_image[..., 0] = np.where(hair_mask == 1, hue_value, hsv_image[..., 0])
|
55 |
+
|
56 |
+
# Saç bölgesinde doygunluk artırımı (isteğe bağlı)
|
57 |
+
hsv_image[..., 1] = np.where(hair_mask == 1, hsv_image[..., 1] * 1.5, hsv_image[..., 1])
|
58 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
59 |
|
60 |
+
final_image = cv.cvtColor(hsv_image, cv.COLOR_HSV2BGR)
|
61 |
+
|
62 |
+
|
63 |
+
return Image.fromarray(cv.cvtColor(final_image, cv.COLOR_BGR2RGB))
|
64 |
+
|
65 |
|
|
|
66 |
iface = gr.Interface(
|
67 |
+
fn=apply_filter,
|
68 |
inputs=[
|
69 |
gr.Image(type="pil"),
|
70 |
gr.Dropdown(
|