Vgjkmhf commited on
Commit
eec0908
·
verified ·
1 Parent(s): fec17d9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +78 -26
app.py CHANGED
@@ -1,36 +1,84 @@
1
  import gradio as gr
2
- from controlnet_aux import OpenposeDetector
3
  from PIL import Image
4
  import numpy as np
5
  import cv2
6
 
7
- # بارگذاری مدل OpenPose
8
- print("در حال بارگذاری مدل OpenPose...")
9
- model = OpenposeDetector.from_pretrained("lllyasviel/ControlNet")
 
 
10
 
11
  def process_image(image):
12
- """استخراج پوز از تصویر با دقت بالا"""
13
  if image is None:
14
  return None
15
 
16
  try:
17
- # تبدیل به numpy array
18
  if isinstance(image, Image.Image):
19
  image = np.array(image)
20
 
21
- # بهبود کیفیت تصویر قبل از پردازش
22
- image = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
23
 
24
- # استخراج پوز با بالاترین دقت ممکن
25
- pose_image = model(
26
- image,
27
- hand_and_face=True, # فعال‌سازی کامل دست و صورت
28
- detect_resolution=1024, # بالاترین رزولوشن برای دقت حداکثری
29
- image_resolution=1024, # رزولوشن خروجی بالا
30
- output_type="pil"
31
- )
32
 
33
- return pose_image
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
 
35
  except Exception as e:
36
  print(f"خطا در پردازش: {str(e)}")
@@ -40,20 +88,24 @@ def process_image(image):
40
  demo = gr.Interface(
41
  fn=process_image,
42
  inputs=gr.Image(type="pil", label="📷 آپلود عکس"),
43
- outputs=gr.Image(type="pil", label="🎯 پوز استخراج شده"),
44
- title="🎯 OpenPose - استخراج پوز از تصویر",
45
  description="""
46
- ### استخراج پوز کامل بدن، دستها و صورت
47
 
48
  این ابزار تشخیص می‌دهد:
49
- - ✅ **بدن کامل**: 18 نقطه کلیدی اسکلت بدن
50
- - ✅ **دست‌ها**: 21 نقطه برای هر دست (42 نقطه کل)
51
- - ✅ **صورت**: 70 نقطه حالت صورت و لبخند
 
52
 
53
- 💡 **نکته**: برای بهترین نتایج از عکس با نور خوب و کیفیت بالا استفاده کنید.
 
 
 
 
54
 
55
- ⚠️ **توجه**: OpenPose گاهی در تشخیص پوزهای پیچیده (مثل دست روی شکم) ممکن است 100٪ دقیق نباشد.
56
- برای دقت بیشتر می‌توانید از مدل‌های پیشرفته‌تر مانند MediaPipe یا MMPose استفاده کنید.
57
  """,
58
  examples=[],
59
  allow_flagging="never"
 
1
  import gradio as gr
2
+ import mediapipe as mp
3
  from PIL import Image
4
  import numpy as np
5
  import cv2
6
 
7
+ # راه‌اندازی MediaPipe Holistic (دقیق‌تر از OpenPose)
8
+ print("در حال بارگذاری MediaPipe Holistic...")
9
+ mp_holistic = mp.solutions.holistic
10
+ mp_drawing = mp.solutions.drawing_utils
11
+ mp_drawing_styles = mp.solutions.drawing_styles
12
 
13
  def process_image(image):
14
+ """استخراج پوز کامل با MediaPipe - دقت بسیار بالا برای بدن، دست‌ها و صورت"""
15
  if image is None:
16
  return None
17
 
18
  try:
19
+ # تبدیل PIL به numpy array و BGR
20
  if isinstance(image, Image.Image):
21
  image = np.array(image)
22
 
23
+ image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
24
+ h, w, c = image_rgb.shape
25
 
26
+ # ایجاد تصویر خروجی سیاه
27
+ output_image = np.zeros((h, w, 3), dtype=np.uint8)
 
 
 
 
 
 
28
 
29
+ # تشخیص پوز با MediaPipe Holistic
30
+ with mp_holistic.Holistic(
31
+ static_image_mode=True,
32
+ model_complexity=2, # بالاترین کیفیت (0, 1, یا 2)
33
+ enable_segmentation=False,
34
+ refine_face_landmarks=True, # جزئیات بیشتر صورت
35
+ min_detection_confidence=0.3, # حساسیت بیشتر برای کاراکترها
36
+ min_tracking_confidence=0.3
37
+ ) as holistic:
38
+ results = holistic.process(image_rgb)
39
+
40
+ # رسم پوز بدن (33 نقطه)
41
+ if results.pose_landmarks:
42
+ mp_drawing.draw_landmarks(
43
+ output_image,
44
+ results.pose_landmarks,
45
+ mp_holistic.POSE_CONNECTIONS,
46
+ landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style()
47
+ )
48
+
49
+ # رسم دست چپ (21 نقطه)
50
+ if results.left_hand_landmarks:
51
+ mp_drawing.draw_landmarks(
52
+ output_image,
53
+ results.left_hand_landmarks,
54
+ mp_holistic.HAND_CONNECTIONS,
55
+ mp_drawing_styles.get_default_hand_landmarks_style(),
56
+ mp_drawing_styles.get_default_hand_connections_style()
57
+ )
58
+
59
+ # رسم دست راست (21 نقطه)
60
+ if results.right_hand_landmarks:
61
+ mp_drawing.draw_landmarks(
62
+ output_image,
63
+ results.right_hand_landmarks,
64
+ mp_holistic.HAND_CONNECTIONS,
65
+ mp_drawing_styles.get_default_hand_landmarks_style(),
66
+ mp_drawing_styles.get_default_hand_connections_style()
67
+ )
68
+
69
+ # رسم صورت (468 نقطه!)
70
+ if results.face_landmarks:
71
+ mp_drawing.draw_landmarks(
72
+ output_image,
73
+ results.face_landmarks,
74
+ mp_holistic.FACEMESH_CONTOURS,
75
+ landmark_drawing_spec=None,
76
+ connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_contours_style()
77
+ )
78
+
79
+ # تبدیل به RGB برای نمایش
80
+ output_image = cv2.cvtColor(output_image, cv2.COLOR_BGR2RGB)
81
+ return Image.fromarray(output_image)
82
 
83
  except Exception as e:
84
  print(f"خطا در پردازش: {str(e)}")
 
88
  demo = gr.Interface(
89
  fn=process_image,
90
  inputs=gr.Image(type="pil", label="📷 آپلود عکس"),
91
+ outputs=gr.Image(type="pil", label="🎯 پوز استخراج شده (MediaPipe Holistic)"),
92
+ title="🎯 MediaPipe Holistic - استخراج پوز با دقت فوق‌العاده",
93
  description="""
94
+ ### 🚀 استخراج پوز با MediaPipe (دقیقتر از OpenPose)
95
 
96
  این ابزار تشخیص می‌دهد:
97
+ - ✅ **بدن کامل**: 33 نقطه کلیدی (بیشتر از OpenPose)
98
+ - ✅ **دست چپ**: 21 نقطه با جزئیات کامل انگشتان
99
+ - ✅ **دست راست**: 21 نقطه با جزئیات کامل انگشتان
100
+ - ✅ **صورت**: 468 نقطه! (شامل لبخند، چشم‌ها، ابرو و...)
101
 
102
+ 💡 **مزایا**:
103
+ - دقت بسیار بالاتر از OpenPose
104
+ - مناسب برای کاراکترهای کارتونی و انیمیشنی
105
+ - تشخیص پوزهای پیچیده (مثل دست روی شکم)
106
+ - تشخیص حالات صورت و لبخند
107
 
108
+ 📌 **نکته**: این مدل برای انسان‌ها و کاراکترهای شبیه انسان طراحی شده است.
 
109
  """,
110
  examples=[],
111
  allow_flagging="never"