sadekmarouf commited on
Commit
54b3ea3
·
verified ·
1 Parent(s): 738e92a

Upload 11 files

Browse files
Dockerfile ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # استخدام نسخة بايثون رسمية
2
+ FROM python:3.9
3
+
4
+ # تحديد مجلد العمل داخل السيرفر
5
+ WORKDIR /code
6
+
7
+ # نسخ ملف المتطلبات أولاً لتسريع التحميل
8
+ COPY ./requirements.txt /code/requirements.txt
9
+
10
+ # تثبيت المكتبات
11
+ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
12
+
13
+ # نسخ باقي ملفات المشروع (بما فيها الموديلات)
14
+ COPY . .
15
+
16
+ # تشغيل FastAPI باستخدام Uvicorn على المنفذ 7860 (الافتراضي لهجنغ فيس)
17
+ CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
food101/.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
food101/README.md ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: other
3
+ base_model: google/mobilenet_v2_1.0_224
4
+ tags:
5
+ - generated_from_trainer
6
+ datasets:
7
+ - food101
8
+ metrics:
9
+ - accuracy
10
+ model-index:
11
+ - name: mobilenet-finetuned-food101
12
+ results:
13
+ - task:
14
+ name: Image Classification
15
+ type: image-classification
16
+ dataset:
17
+ name: food101
18
+ type: food101
19
+ config: default
20
+ split: train[:5000]
21
+ args: default
22
+ metrics:
23
+ - name: Accuracy
24
+ type: accuracy
25
+ value: 0.821
26
+ ---
27
+
28
+ <!-- This model card has been generated automatically according to the information the Trainer had access to. You
29
+ should probably proofread and complete it, then remove this comment. -->
30
+
31
+ # mobilenet-finetuned-food101
32
+
33
+ This model is a fine-tuned version of [google/mobilenet_v2_1.0_224](https://huggingface.co/google/mobilenet_v2_1.0_224) on the food101 dataset.
34
+ It achieves the following results on the evaluation set:
35
+ - Loss: 0.5518
36
+ - Accuracy: 0.821
37
+
38
+ ## Model description
39
+
40
+ More information needed
41
+
42
+ ## Intended uses & limitations
43
+
44
+ More information needed
45
+
46
+ ## Training and evaluation data
47
+
48
+ More information needed
49
+
50
+ ## Training procedure
51
+
52
+ ### Training hyperparameters
53
+
54
+ The following hyperparameters were used during training:
55
+ - learning_rate: 5e-05
56
+ - train_batch_size: 128
57
+ - eval_batch_size: 128
58
+ - seed: 42
59
+ - gradient_accumulation_steps: 4
60
+ - total_train_batch_size: 512
61
+ - optimizer: Adam with betas=(0.9,0.999) and epsilon=1e-08
62
+ - lr_scheduler_type: linear
63
+ - lr_scheduler_warmup_ratio: 0.1
64
+ - num_epochs: 30
65
+
66
+ ### Training results
67
+
68
+ | Training Loss | Epoch | Step | Validation Loss | Accuracy |
69
+ |:-------------:|:-----:|:----:|:---------------:|:--------:|
70
+ | No log | 1.0 | 6 | 1.9575 | 0.153 |
71
+ | 1.9536 | 2.0 | 12 | 1.8509 | 0.265 |
72
+ | 1.9536 | 3.0 | 18 | 1.7003 | 0.451 |
73
+ | 1.7915 | 4.0 | 24 | 1.5181 | 0.578 |
74
+ | 1.4994 | 5.0 | 30 | 1.3609 | 0.631 |
75
+ | 1.4994 | 6.0 | 36 | 1.2321 | 0.669 |
76
+ | 1.2203 | 7.0 | 42 | 1.0696 | 0.69 |
77
+ | 1.2203 | 8.0 | 48 | 0.9676 | 0.723 |
78
+ | 1.0215 | 9.0 | 54 | 0.8888 | 0.729 |
79
+ | 0.8462 | 10.0 | 60 | 0.8380 | 0.74 |
80
+ | 0.8462 | 11.0 | 66 | 0.7461 | 0.778 |
81
+ | 0.744 | 12.0 | 72 | 0.6724 | 0.792 |
82
+ | 0.744 | 13.0 | 78 | 0.7314 | 0.769 |
83
+ | 0.6496 | 14.0 | 84 | 0.6831 | 0.77 |
84
+ | 0.6143 | 15.0 | 90 | 0.5937 | 0.81 |
85
+ | 0.6143 | 16.0 | 96 | 0.6217 | 0.793 |
86
+ | 0.5468 | 17.0 | 102 | 0.5965 | 0.788 |
87
+ | 0.5468 | 18.0 | 108 | 0.5944 | 0.813 |
88
+ | 0.5428 | 19.0 | 114 | 0.5869 | 0.812 |
89
+ | 0.5193 | 20.0 | 120 | 0.5565 | 0.82 |
90
+ | 0.5193 | 21.0 | 126 | 0.6155 | 0.803 |
91
+ | 0.4902 | 22.0 | 132 | 0.5685 | 0.817 |
92
+ | 0.4902 | 23.0 | 138 | 0.6097 | 0.789 |
93
+ | 0.4869 | 24.0 | 144 | 0.6002 | 0.8 |
94
+ | 0.4745 | 25.0 | 150 | 0.5569 | 0.814 |
95
+ | 0.4745 | 26.0 | 156 | 0.5414 | 0.821 |
96
+ | 0.4653 | 27.0 | 162 | 0.5806 | 0.807 |
97
+ | 0.4653 | 28.0 | 168 | 0.5663 | 0.807 |
98
+ | 0.4543 | 29.0 | 174 | 0.5412 | 0.825 |
99
+ | 0.4575 | 30.0 | 180 | 0.5518 | 0.821 |
100
+
101
+
102
+ ### Framework versions
103
+
104
+ - Transformers 4.35.2
105
+ - Pytorch 2.1.0+cu118
106
+ - Datasets 2.15.0
107
+ - Tokenizers 0.15.0
food101/config.json ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_name_or_path": "google/mobilenet_v2_1.0_224",
3
+ "architectures": [
4
+ "MobileNetV2ForImageClassification"
5
+ ],
6
+ "classifier_dropout_prob": 0.2,
7
+ "depth_divisible_by": 8,
8
+ "depth_multiplier": 1.0,
9
+ "expand_ratio": 6,
10
+ "finegrained_output": true,
11
+ "first_layer_is_expansion": true,
12
+ "hidden_act": "relu6",
13
+ "id2label": {
14
+ "0": "beignets",
15
+ "1": "bruschetta",
16
+ "2": "chicken_wings",
17
+ "3": "hamburger",
18
+ "4": "pork_chop",
19
+ "5": "prime_rib",
20
+ "6": "ramen"
21
+ },
22
+ "image_size": 224,
23
+ "initializer_range": 0.02,
24
+ "label2id": {
25
+ "beignets": 0,
26
+ "bruschetta": 1,
27
+ "chicken_wings": 2,
28
+ "hamburger": 3,
29
+ "pork_chop": 4,
30
+ "prime_rib": 5,
31
+ "ramen": 6
32
+ },
33
+ "layer_norm_eps": 0.001,
34
+ "min_depth": 8,
35
+ "model_type": "mobilenet_v2",
36
+ "num_channels": 3,
37
+ "output_stride": 32,
38
+ "problem_type": "single_label_classification",
39
+ "semantic_loss_ignore_index": 255,
40
+ "tf_padding": true,
41
+ "torch_dtype": "float32",
42
+ "transformers_version": "4.35.2"
43
+ }
food101/model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ce7b82d2fd228b55d70a63370bb3468087cfdfee4d5ea0e06344e6a1c605bdb4
3
+ size 9105836
food101/preprocessor_config.json ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "crop_size": {
3
+ "height": 224,
4
+ "width": 224
5
+ },
6
+ "do_center_crop": true,
7
+ "do_normalize": true,
8
+ "do_rescale": true,
9
+ "do_resize": true,
10
+ "image_mean": [
11
+ 0.5,
12
+ 0.5,
13
+ 0.5
14
+ ],
15
+ "image_processor_type": "MobileNetV2ImageProcessor",
16
+ "image_std": [
17
+ 0.5,
18
+ 0.5,
19
+ 0.5
20
+ ],
21
+ "resample": 2,
22
+ "rescale_factor": 0.00392156862745098,
23
+ "size": {
24
+ "shortest_edge": 256
25
+ },
26
+ "use_square_size": false
27
+ }
food101/training_args.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4203d7b2f4ed0167633d8dfdc236108a64820595d999f93debac4848b22adb03
3
+ size 4600
main.py ADDED
@@ -0,0 +1,207 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, UploadFile, File
2
+ import joblib
3
+ import pandas as pd
4
+ import numpy as np
5
+ from pydantic import BaseModel
6
+ import os
7
+ from transformers import AutoImageProcessor, AutoModelForImageClassification
8
+ from PIL import Image
9
+ import torch
10
+ import io
11
+
12
+ app = FastAPI()
13
+
14
+ # ==============================
15
+ # المتغيرات العالمية للمودلات
16
+ # ==============================
17
+
18
+ maternal_model = None
19
+ genetic_model = None
20
+ food_model = None
21
+ food_processor = None
22
+
23
+ # ==============================
24
+ # تحميل المودلات عند تشغيل السيرفر
25
+ # ==============================
26
+
27
+ @app.on_event("startup")
28
+ def load_models():
29
+ global maternal_model, genetic_model, food_model, food_processor
30
+
31
+ # تحميل موديل الأم
32
+ try:
33
+ if os.path.exists("random_forest_model.joblib"):
34
+ maternal_model = joblib.load("random_forest_model.joblib")
35
+ print("✅ Maternal model loaded successfully")
36
+ else:
37
+ print("❌ File 'random_forest_model.joblib' NOT found!")
38
+ except Exception as e:
39
+ print(f"❌ Error loading Maternal model: {e}")
40
+
41
+ # تحميل موديل الوراثة
42
+ try:
43
+ model_name = "thaqafni_model.pkl"
44
+ if os.path.exists(model_name):
45
+ genetic_model = joblib.load(model_name)
46
+ print(f"✅ Genetic model '{model_name}' loaded successfully")
47
+ else:
48
+ print(f"❌ File '{model_name}' NOT found!")
49
+ except Exception as e:
50
+ print(f"❌ Error loading Genetic model: {e}")
51
+
52
+ # تحميل مودل التعرف على الطعام
53
+ try:
54
+ food_path = "food101"
55
+
56
+ if os.path.exists(food_path):
57
+ food_processor = AutoImageProcessor.from_pretrained(food_path)
58
+ food_model = AutoModelForImageClassification.from_pretrained(food_path)
59
+
60
+ print("✅ Food model loaded successfully")
61
+
62
+ else:
63
+ print("❌ Folder 'food101' NOT found!")
64
+
65
+ except Exception as e:
66
+ print(f"❌ Error loading Food model: {e}")
67
+
68
+ # ==============================
69
+ # نماذج البيانات
70
+ # ==============================
71
+
72
+ class MaternalInput(BaseModel):
73
+ age: int
74
+ systolic_bp: int
75
+ diastolic_bp: int
76
+ bs: float
77
+ body_temp: float
78
+ heart_rate: int
79
+
80
+ class GeneticInput(BaseModel):
81
+ age: int
82
+ family_history: int
83
+ hemoglobin: float
84
+ fetal_hemoglobin: float
85
+ sweat_chloride: float
86
+ sickled_rbc_percent: float
87
+
88
+ # ==============================
89
+ # الصفحة الرئيسية
90
+ # ==============================
91
+
92
+ @app.get("/")
93
+ def home():
94
+ return {
95
+ "status": "online",
96
+ "maternal_model": "Ready" if maternal_model else "Not Loaded",
97
+ "genetic_model": "Ready" if genetic_model else "Not Loaded",
98
+ "food_model": "Ready" if food_model else "Not Loaded"
99
+ }
100
+
101
+ # ==============================
102
+ # مودل مخاطر الأم
103
+ # ==============================
104
+
105
+ @app.post("/predict_maternal")
106
+ async def predict_maternal(data: MaternalInput):
107
+
108
+ if not maternal_model:
109
+ return {"error": "Maternal model is not available"}
110
+
111
+ features = np.array([[
112
+ data.age,
113
+ data.systolic_bp,
114
+ data.diastolic_bp,
115
+ data.bs,
116
+ data.body_temp,
117
+ data.heart_rate
118
+ ]])
119
+
120
+ prediction = maternal_model.predict(features)
121
+
122
+ return {
123
+ "risk_level": int(prediction[0])
124
+ }
125
+
126
+ # ==============================
127
+ # مودل الأمراض الوراثية
128
+ # ==============================
129
+
130
+ @app.post("/predict_genetic")
131
+ async def predict_genetic(data: GeneticInput):
132
+
133
+ if not genetic_model:
134
+ return {"error": "Genetic model is not available"}
135
+
136
+ input_data = pd.DataFrame([[
137
+ data.age,
138
+ data.family_history,
139
+ data.hemoglobin,
140
+ data.fetal_hemoglobin,
141
+ data.sweat_chloride,
142
+ data.sickled_rbc_percent
143
+ ]],
144
+ columns=[
145
+ 'Age',
146
+ 'Family_History',
147
+ 'Hemoglobin',
148
+ 'Fetal_Hemoglobin',
149
+ 'Sweat_Chloride',
150
+ 'Sickled_RBC_Percent'
151
+ ])
152
+
153
+ prediction = genetic_model.predict(input_data)[0]
154
+
155
+ probabilities = genetic_model.predict_proba(input_data)[0]
156
+ confidence = float(np.max(probabilities) * 100)
157
+
158
+ ar_map = {
159
+ "Thalassemia": "ثلاسيميا",
160
+ "Normal": "سليم - طبيعي",
161
+ "Sickle Cell Anemia": "فقر الدم المنجلي",
162
+ "Cystic Fibrosis": "تليف كيسي",
163
+ "High Risk": "معرض لخطورة عالية"
164
+ }
165
+
166
+ return {
167
+ "diagnosis": prediction,
168
+ "diagnosis_ar": ar_map.get(prediction, "غير معروف"),
169
+ "confidence": f"{confidence:.2f}%",
170
+ "status": "success"
171
+ }
172
+
173
+ # ==============================
174
+ # مودل التعرف على ال��عام
175
+ # ==============================
176
+
177
+ @app.post("/predict_food")
178
+ async def predict_food(file: UploadFile = File(...)):
179
+
180
+ if not food_model:
181
+ return {"error": "Food model is not available"}
182
+
183
+ try:
184
+ image_bytes = await file.read()
185
+
186
+ image = Image.open(io.BytesIO(image_bytes)).convert("RGB")
187
+
188
+ inputs = food_processor(images=image, return_tensors="pt")
189
+
190
+ with torch.no_grad():
191
+ outputs = food_model(**inputs)
192
+
193
+ logits = outputs.logits
194
+ predicted_class_id = logits.argmax(-1).item()
195
+
196
+ food_name = food_model.config.id2label[predicted_class_id]
197
+
198
+ return {
199
+ "food_id": predicted_class_id,
200
+ "food_name": food_name,
201
+ "status": "success"
202
+ }
203
+
204
+ except Exception as e:
205
+ return {
206
+ "error": str(e)
207
+ }
random_forest_model.joblib ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:602ace1ea6d6d37d5b0d043e731343d1b6bb714311c2107b02b383d194ab74af
3
+ size 2721105
requirements.txt ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ fastapi
2
+ uvicorn
3
+ joblib
4
+ scikit-learn
5
+ pandas
6
+ numpy
7
+ xgboost
8
+ transformers
9
+ torch
10
+ Pillow
11
+ python-multipart
12
+ torch==2.2.2+cpu --index-url https://download.pytorch.org/whl/cpu
thaqafni_model.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d8964035e6a668d7fe541570253a35b73b85a344ffadd5d2a00d65c43a9681e4
3
+ size 2389345