EngReem85 commited on
Commit
51403ec
·
verified ·
1 Parent(s): 87a7a87

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +21 -36
app.py CHANGED
@@ -5,7 +5,7 @@ import cv2
5
  from tensorflow.keras import datasets
6
 
7
  # ============================================
8
- # 1. تحميل النموذج المحفوظ (تأكد من وجوده في نفس المجلد)
9
  # ============================================
10
  model = tf.keras.models.load_model('mnist_cnn_model.keras')
11
  print("✅ تم تحميل النموذج بنجاح!")
@@ -17,87 +17,72 @@ print("✅ تم تحميل النموذج بنجاح!")
17
  test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255
18
 
19
  # ============================================
20
- # 3. دالة التنبؤ على الصورة المرسومة (Sketchpad)
21
  # ============================================
22
  def predict_sketch(image):
23
  """
24
- تستقبل الصورة من لوحة الرسم، تعالجها، وتعيد الاحتمالات لجميع الفئات.
25
  """
26
  try:
27
  # تحويل الصورة إلى تدرج رمادي
28
  gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
29
-
30
- # تغيير الحجم إلى 28×28 (مثل صور MNIST)
31
  resized = cv2.resize(gray, (28, 28))
32
-
33
- # قلب الألوان (لأن Sketchpad يرسم بالأبيض على الأسود، لكن أحياناً يكون معكوساً)
34
  inverted = 255 - resized
35
-
36
- # تطبيع القيم لتكون بين 0 و 1
37
  normalized = inverted.astype('float32') / 255.0
38
-
39
- # إعادة التشكيل لتناسب نموذج CNN
40
  reshaped = normalized.reshape(1, 28, 28, 1)
41
 
42
  # التنبؤ
43
  prediction = model.predict(reshaped, verbose=0)[0]
44
-
45
- # إرجاع الاحتمالات كقاموس (لتعرضها واجهة Gradio بشكل جميل)
46
  return {str(i): float(prediction[i]) for i in range(10)}
47
-
48
  except Exception as e:
49
  return {"خطأ": str(e)}
50
 
51
  # ============================================
52
- # 4. دالة عرض مثال عشوائي (تحقيق طلبك بالعشوائية)
53
  # ============================================
54
  def random_example():
55
- """
56
- تختار صورة عشوائية من مجموعة الاختبار، وتعرضها في لوحة الرسم،
57
- وتكتب رقمها الحقيقي في مربع المعلومات.
58
- """
59
  idx = np.random.randint(0, len(test_images))
60
- img = test_images[idx].reshape(28, 28) # استخراج الصورة (28×28)
61
-
62
- # تحويل الصورة إلى 3 قنوات (RGB) لأن Sketchpad يتوقع صورة ملونة
63
  img_rgb = np.stack([img] * 3, axis=2)
64
-
65
- # نص المعلومات
66
  info_text = f"🖼️ مثال عشوائي رقم {idx} | الرقم الحقيقي: {test_labels[idx]}"
67
-
68
  return img_rgb, info_text
69
 
70
  # ============================================
71
- # 5. بناء واجهة Gradio (باستخدام Blocks للتحكم الكامل)
72
  # ============================================
73
- with gr.Blocks(title="MNIST Digit Recognizer", theme=gr.themes.Soft()) as demo:
74
  gr.Markdown("# 🧠 التعرف على الأرقام المكتوبة بخط اليد")
75
- gr.Markdown("ارسم رقماً في المربع، أو اضغط على زر **'عرض مثال عشوائي'** لتجربة النموذج على بيانات MNIST.")
76
 
77
  with gr.Row():
78
- # عمود المدخلات (لوحة الرسم + الأزرار)
79
  with gr.Column(scale=1):
 
80
  sketch = gr.Sketchpad(
81
  label="✏️ ارسم هنا",
82
- image_size=(280, 280),
83
- brush_color="#FFFFFF", # فرشاة بيضاء على خلفية سوداء
84
- brush_radius=12
 
85
  )
86
  with gr.Row():
87
  submit_btn = gr.Button("🔮 توقع", variant="primary")
88
  random_btn = gr.Button("🎲 عرض مثال عشوائي", variant="secondary")
89
  info = gr.Textbox(label="📌 معلومات", interactive=False, value="ارسم أو اختر مثالاً عشوائياً")
90
 
91
- # عمود المخرجات (نتائج التنبؤ)
92
  with gr.Column(scale=1):
93
  output = gr.Label(num_top_classes=3, label="📊 الاحتمالات (أعلى 3 فئات)")
94
 
95
- # ربط الأزرار بالدوال
96
  submit_btn.click(fn=predict_sketch, inputs=sketch, outputs=output)
97
  random_btn.click(fn=random_example, inputs=[], outputs=[sketch, info])
98
 
99
  # ============================================
100
- # 6. تشغيل التطبيق
101
  # ============================================
102
  if __name__ == "__main__":
103
- demo.launch(share=True)
 
5
  from tensorflow.keras import datasets
6
 
7
  # ============================================
8
+ # 1. تحميل النموذج المحفوظ
9
  # ============================================
10
  model = tf.keras.models.load_model('mnist_cnn_model.keras')
11
  print("✅ تم تحميل النموذج بنجاح!")
 
17
  test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255
18
 
19
  # ============================================
20
+ # 3. دالة التنبؤ على الصورة المرسومة
21
  # ============================================
22
  def predict_sketch(image):
23
  """
24
+ تستقبل الصورة من لوحة الرسم، تعالجها، وتعيد الاحتمالات.
25
  """
26
  try:
27
  # تحويل الصورة إلى تدرج رمادي
28
  gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
29
+ # تغيير الحجم إلى 28×28
 
30
  resized = cv2.resize(gray, (28, 28))
31
+ # قلب الألوان (نفترض أن الخلفية سوداء والرسم أبيض)
 
32
  inverted = 255 - resized
33
+ # تطبيع القيم إلى [0,1]
 
34
  normalized = inverted.astype('float32') / 255.0
35
+ # إعادة التشكيل لتناسب CNN
 
36
  reshaped = normalized.reshape(1, 28, 28, 1)
37
 
38
  # التنبؤ
39
  prediction = model.predict(reshaped, verbose=0)[0]
 
 
40
  return {str(i): float(prediction[i]) for i in range(10)}
 
41
  except Exception as e:
42
  return {"خطأ": str(e)}
43
 
44
  # ============================================
45
+ # 4. دالة عرض مثال عشوائي
46
  # ============================================
47
  def random_example():
 
 
 
 
48
  idx = np.random.randint(0, len(test_images))
49
+ img = test_images[idx].reshape(28, 28)
50
+ # تحويل إلى 3 قنوات (RGB) لأن Sketchpad يتوقع صورة ملونة
 
51
  img_rgb = np.stack([img] * 3, axis=2)
 
 
52
  info_text = f"🖼️ مثال عشوائي رقم {idx} | الرقم الحقيقي: {test_labels[idx]}"
 
53
  return img_rgb, info_text
54
 
55
  # ============================================
56
+ # 5. بناء واجهة Gradio (باستخدام Blocks)
57
  # ============================================
58
+ with gr.Blocks(title="MNIST Digit Recognizer") as demo:
59
  gr.Markdown("# 🧠 التعرف على الأرقام المكتوبة بخط اليد")
60
+ gr.Markdown("ارسم رقماً في المربع، أو اضغط على زر **'عرض مثال عشوائي'** لتجربة النموذج.")
61
 
62
  with gr.Row():
 
63
  with gr.Column(scale=1):
64
+ # 🔥 تم إزالة image_size واستخدام width/height (مدعومة في جميع الإصدارات)
65
  sketch = gr.Sketchpad(
66
  label="✏️ ارسم هنا",
67
+ brush_color="#FFFFFF",
68
+ brush_radius=12,
69
+ height=280,
70
+ width=280
71
  )
72
  with gr.Row():
73
  submit_btn = gr.Button("🔮 توقع", variant="primary")
74
  random_btn = gr.Button("🎲 عرض مثال عشوائي", variant="secondary")
75
  info = gr.Textbox(label="📌 معلومات", interactive=False, value="ارسم أو اختر مثالاً عشوائياً")
76
 
 
77
  with gr.Column(scale=1):
78
  output = gr.Label(num_top_classes=3, label="📊 الاحتمالات (أعلى 3 فئات)")
79
 
80
+ # ربط الأزرار
81
  submit_btn.click(fn=predict_sketch, inputs=sketch, outputs=output)
82
  random_btn.click(fn=random_example, inputs=[], outputs=[sketch, info])
83
 
84
  # ============================================
85
+ # 6. تشغيل التطبيق (ننقل theme إلى هنا)
86
  # ============================================
87
  if __name__ == "__main__":
88
+ demo.launch(share=True, theme=gr.themes.Soft())