EngReem85 commited on
Commit
cfecae9
·
verified ·
1 Parent(s): 0ab224a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +36 -12
app.py CHANGED
@@ -3,12 +3,36 @@ import numpy as np
3
  import tensorflow as tf
4
  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("✅ تم تحميل النموذج بنجاح!")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
  # ============================================
14
  # 2. تحميل بيانات MNIST للاستخدام في الأمثلة العشوائية
@@ -24,10 +48,11 @@ def predict_sketch(image):
24
  تستقبل الصورة من لوحة الرسم، تعالجها، وتعيد الاحتمالات.
25
  """
26
  try:
27
- # image تكون بصيغة (height, width, 3) من نوع numpy
28
  gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
 
29
  resized = cv2.resize(gray, (28, 28))
30
- # قلب الألوان (افتراض أن الخلفية سوداء والرسم أبيض)
31
  inverted = 255 - resized
32
  normalized = inverted.astype('float32') / 255.0
33
  reshaped = normalized.reshape(1, 28, 28, 1)
@@ -43,21 +68,20 @@ def predict_sketch(image):
43
  def random_example():
44
  idx = np.random.randint(0, len(test_images))
45
  img = test_images[idx].reshape(28, 28)
46
- # تحويل إلى 3 قنوات (RGB) لأن Sketchpad يتوقع صورة ملونة
47
  img_rgb = np.stack([img] * 3, axis=2)
48
  info_text = f"🖼️ مثال عشوائي رقم {idx} | الرقم الحقيقي: {test_labels[idx]}"
49
  return img_rgb, info_text
50
 
51
  # ============================================
52
- # 5. بناء واجهة Gradio (باستخدام gr.Sketchpad بدون وسائط إضافية)
53
  # ============================================
54
  with gr.Blocks(title="MNIST Digit Recognizer") as demo:
55
  gr.Markdown("# 🧠 التعرف على الأرقام المكتوبة بخط اليد")
56
- gr.Markdown("ارسم رقماً في المربع، أو اضغط على زر **'عرض مثال عشوائي'** لتجربة النموذج.")
57
 
58
  with gr.Row():
59
  with gr.Column(scale=1):
60
- # استخدام Sketchpad بدون أي وسائط إضافية
61
  sketch = gr.Sketchpad(label="✏️ ارسم هنا")
62
  with gr.Row():
63
  submit_btn = gr.Button("🔮 توقع", variant="primary")
@@ -67,12 +91,12 @@ with gr.Blocks(title="MNIST Digit Recognizer") as demo:
67
  with gr.Column(scale=1):
68
  output = gr.Label(num_top_classes=3, label="📊 الاحتمالات (أعلى 3 فئات)")
69
 
70
- # ربط الأزرار
71
  submit_btn.click(fn=predict_sketch, inputs=sketch, outputs=output)
72
  random_btn.click(fn=random_example, inputs=[], outputs=[sketch, info])
73
 
74
  # ============================================
75
- # 6. تشغيل التطبيق
76
  # ============================================
77
  if __name__ == "__main__":
78
- demo.launch(share=True)
 
 
3
  import tensorflow as tf
4
  import cv2
5
  from tensorflow.keras import datasets
6
+ import os
7
 
8
  # ============================================
9
+ # 1. تحميل النموذج المحفوظ (من المجلد الحالي)
10
  # ============================================
11
+ model_path = 'mnist_cnn_model.keras'
12
+ if os.path.exists(model_path):
13
+ model = tf.keras.models.load_model(model_path)
14
+ print("✅ تم تحميل النموذج بنجاح!")
15
+ else:
16
+ # إذا لم يكن النموذج موجوداً، قم ببنائه وتدريبه (حل احتياطي)
17
+ print("⚠️ النموذج غير موجود، سيتم بناؤه وتدريبه الآن...")
18
+ from tensorflow.keras import layers, models
19
+ model = models.Sequential([
20
+ layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
21
+ layers.MaxPooling2D((2, 2)),
22
+ layers.Conv2D(64, (3, 3), activation='relu'),
23
+ layers.MaxPooling2D((2, 2)),
24
+ layers.Flatten(),
25
+ layers.Dense(64, activation='relu'),
26
+ layers.Dense(10, activation='softmax')
27
+ ])
28
+ model.compile(optimizer='adam',
29
+ loss='sparse_categorical_crossentropy',
30
+ metrics=['accuracy'])
31
+ (train_images, train_labels), _ = datasets.mnist.load_data()
32
+ train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
33
+ model.fit(train_images, train_labels, epochs=3, validation_split=0.1, verbose=1)
34
+ model.save('mnist_cnn_model.keras')
35
+ print("✅ تم بناء وتدريب النموذج وحفظه.")
36
 
37
  # ============================================
38
  # 2. تحميل بيانات MNIST للاستخدام في الأمثلة العشوائية
 
48
  تستقبل الصورة من لوحة الرسم، تعالجها، وتعيد الاحتمالات.
49
  """
50
  try:
51
+ # تحويل إلى تدرج رمادي
52
  gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
53
+ # تغيير الحجم إلى 28×28
54
  resized = cv2.resize(gray, (28, 28))
55
+ # قلب الألوان (الخلفية سوداء والرسم أبيض)
56
  inverted = 255 - resized
57
  normalized = inverted.astype('float32') / 255.0
58
  reshaped = normalized.reshape(1, 28, 28, 1)
 
68
  def random_example():
69
  idx = np.random.randint(0, len(test_images))
70
  img = test_images[idx].reshape(28, 28)
71
+ # تحويل إلى 3 قنوات (RGB)
72
  img_rgb = np.stack([img] * 3, axis=2)
73
  info_text = f"🖼️ مثال عشوائي رقم {idx} | الرقم الحقيقي: {test_labels[idx]}"
74
  return img_rgb, info_text
75
 
76
  # ============================================
77
+ # 5. بناء واجهة Gradio
78
  # ============================================
79
  with gr.Blocks(title="MNIST Digit Recognizer") as demo:
80
  gr.Markdown("# 🧠 التعرف على الأرقام المكتوبة بخط اليد")
81
+ gr.Markdown("ارسم رقماً (0-9) في المربع، أو اضغط على زر **'عرض مثال عشوائي'**.")
82
 
83
  with gr.Row():
84
  with gr.Column(scale=1):
 
85
  sketch = gr.Sketchpad(label="✏️ ارسم هنا")
86
  with gr.Row():
87
  submit_btn = gr.Button("🔮 توقع", variant="primary")
 
91
  with gr.Column(scale=1):
92
  output = gr.Label(num_top_classes=3, label="📊 الاحتمالات (أعلى 3 فئات)")
93
 
 
94
  submit_btn.click(fn=predict_sketch, inputs=sketch, outputs=output)
95
  random_btn.click(fn=random_example, inputs=[], outputs=[sketch, info])
96
 
97
  # ============================================
98
+ # 6. تشغيل التطبيق (بدون share=True)
99
  # ============================================
100
  if __name__ == "__main__":
101
+ # في Spaces، لا حاجة لـ share=True، والمنفذ 7860 هو الافتراضي
102
+ demo.launch(server_name="0.0.0.0", server_port=7860)