Stas commited on
Commit
a002adb
·
1 Parent(s): ea979f5

Initial commit for Tomato Disease Detection Space

Browse files
Files changed (3) hide show
  1. .gitattributes +35 -35
  2. README.md +10 -10
  3. hf_app.py +109 -109
.gitattributes CHANGED
@@ -1,35 +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
 
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
README.md CHANGED
@@ -1,10 +1,10 @@
1
- ---
2
- title: Tomato Disease Training
3
- emoji: 🐢
4
- colorFrom: pink
5
- colorTo: pink
6
- sdk: docker
7
- pinned: false
8
- ---
9
-
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
+ ---
2
+ title: Tomato Disease Training
3
+ emoji: 🐢
4
+ colorFrom: pink
5
+ colorTo: pink
6
+ sdk: docker
7
+ pinned: false
8
+ ---
9
+
10
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
hf_app.py CHANGED
@@ -1,109 +1,109 @@
1
- import os
2
- import cv2
3
- import numpy as np
4
- import torch
5
- import gradio as gr
6
- from fastapi import FastAPI, File, UploadFile
7
- from sklearn.preprocessing import StandardScaler
8
- from sklearn.svm import SVC
9
-
10
- # Список классов болезней
11
- DISEASE_CLASSES = [
12
- 'Tomato___Bacterial_spot',
13
- 'Tomato___Early_blight',
14
- 'Tomato___Late_blight',
15
- 'Tomato___Leaf_Mold',
16
- 'Tomato___Septoria_leaf_spot',
17
- 'Tomato___Spider_mites Two-spotted_spider_mite',
18
- 'Tomato___Target_Spot',
19
- 'Tomato___Tomato_Yellow_Leaf_Curl_Virus',
20
- 'Tomato___Tomato_mosaic_virus',
21
- 'Tomato___healthy'
22
- ]
23
-
24
- def preprocess_image(image):
25
- """Подготовка изображения для предсказания"""
26
- if image is None:
27
- return None
28
-
29
- # Resize и flatten
30
- img_resized = cv2.resize(image, (64, 64))
31
- img_flattened = img_resized.flatten()
32
-
33
- return img_flattened
34
-
35
- def load_model():
36
- """Загрузка обученной модели"""
37
- try:
38
- # Загрузка модели SVM
39
- model_path = '/tmp/data/state/SVC_comb_R.pth.pth'
40
-
41
- # Если модель не существует, возвращаем None
42
- if not os.path.exists(model_path):
43
- print(f"Модель не найдена по пути: {model_path}")
44
- return None, None
45
-
46
- model_data = torch.load(model_path)
47
-
48
- # Создание pipeline с масштабированием
49
- scaler = StandardScaler()
50
- scaler.mean_ = model_data['mean']
51
- scaler.scale_ = model_data['std']
52
-
53
- classifier = model_data['classifier']
54
-
55
- return scaler, classifier
56
- except Exception as e:
57
- print(f"Ошибка загрузки модели: {e}")
58
- return None, None
59
-
60
- def predict_disease(image):
61
- """Предсказание болезни томата"""
62
- if image is None:
63
- return "Пожалуйста, загрузите изображение"
64
-
65
- # Загрузка модели
66
- scaler, classifier = load_model()
67
- if scaler is None or classifier is None:
68
- return "Ошибка загрузки модели. Возможно, нужно сначала обучить модель."
69
-
70
- # Предобработка изображения
71
- processed_image = preprocess_image(image)
72
- if processed_image is None:
73
- return "Не удалось обработать изображение"
74
-
75
- # Масштабирование
76
- processed_image = scaler.transform([processed_image])
77
-
78
- # Предсказание
79
- prediction = classifier.predict(processed_image)
80
- probabilities = classifier.predict_proba(processed_image)[0]
81
-
82
- # Формирование результата
83
- result = f"Обнаружено: {prediction[0]}\n\n"
84
- result += "Вероятности:\n"
85
- for disease, prob in zip(DISEASE_CLASSES, probabilities):
86
- result += f"{disease}: {prob*100:.2f}%\n"
87
-
88
- return result
89
-
90
- # FastAPI приложение
91
- app = FastAPI()
92
-
93
- # Gradio интерфейс
94
- iface = gr.Interface(
95
- fn=predict_disease,
96
- inputs=gr.Image(type="numpy", label="Загрузите изображение листа томата"),
97
- outputs=gr.Textbox(label="Результат диагностики"),
98
- title="Диагностика болезней томатов",
99
- description="Загрузите изображение листа томата для определения заболевания"
100
- )
101
-
102
- # Маршрут для Gradio
103
- @app.get("/")
104
- def read_root():
105
- return {"status": "Tomato Disease Classifier is running"}
106
-
107
- # Запуск Gradio
108
- if __name__ == "__main__":
109
- iface.launch(server_name="0.0.0.0", server_port=7860)
 
1
+ import os
2
+ import cv2
3
+ import numpy as np
4
+ import torch
5
+ import gradio as gr
6
+ from fastapi import FastAPI, File, UploadFile
7
+ from sklearn.preprocessing import StandardScaler
8
+ from sklearn.svm import SVC
9
+
10
+ # Список классов болезней
11
+ DISEASE_CLASSES = [
12
+ 'Tomato___Bacterial_spot',
13
+ 'Tomato___Early_blight',
14
+ 'Tomato___Late_blight',
15
+ 'Tomato___Leaf_Mold',
16
+ 'Tomato___Septoria_leaf_spot',
17
+ 'Tomato___Spider_mites Two-spotted_spider_mite',
18
+ 'Tomato___Target_Spot',
19
+ 'Tomato___Tomato_Yellow_Leaf_Curl_Virus',
20
+ 'Tomato___Tomato_mosaic_virus',
21
+ 'Tomato___healthy'
22
+ ]
23
+
24
+ def preprocess_image(image):
25
+ """Подготовка изображения для предсказания"""
26
+ if image is None:
27
+ return None
28
+
29
+ # Resize и flatten
30
+ img_resized = cv2.resize(image, (64, 64))
31
+ img_flattened = img_resized.flatten()
32
+
33
+ return img_flattened
34
+
35
+ def load_model():
36
+ """Загрузка обученной модели"""
37
+ try:
38
+ # Загрузка модели SVM
39
+ model_path = '/tmp/data/state/SVC_comb_R.pth.pth'
40
+
41
+ # Если модель не существует, возвращаем None
42
+ if not os.path.exists(model_path):
43
+ print(f"Модель не найдена по пути: {model_path}")
44
+ return None, None
45
+
46
+ model_data = torch.load(model_path)
47
+
48
+ # Создание pipeline с масштабированием
49
+ scaler = StandardScaler()
50
+ scaler.mean_ = model_data['mean']
51
+ scaler.scale_ = model_data['std']
52
+
53
+ classifier = model_data['classifier']
54
+
55
+ return scaler, classifier
56
+ except Exception as e:
57
+ print(f"Ошибка загрузки модели: {e}")
58
+ return None, None
59
+
60
+ def predict_disease(image):
61
+ """Предсказание болезни томата"""
62
+ if image is None:
63
+ return "Пожалуйста, загрузите изображение"
64
+
65
+ # Загрузка модели
66
+ scaler, classifier = load_model()
67
+ if scaler is None or classifier is None:
68
+ return "Ошибка загрузки модели. Возможно, нужно сначала обучить модель."
69
+
70
+ # Предобработка изображения
71
+ processed_image = preprocess_image(image)
72
+ if processed_image is None:
73
+ return "Не удалось обработать изображение"
74
+
75
+ # Масштабирование
76
+ processed_image = scaler.transform([processed_image])
77
+
78
+ # Предсказание
79
+ prediction = classifier.predict(processed_image)
80
+ probabilities = classifier.predict_proba(processed_image)[0]
81
+
82
+ # Формирование результата
83
+ result = f"Обнаружено: {prediction[0]}\n\n"
84
+ result += "Вероятности:\n"
85
+ for disease, prob in zip(DISEASE_CLASSES, probabilities):
86
+ result += f"{disease}: {prob*100:.2f}%\n"
87
+
88
+ return result
89
+
90
+ # FastAPI приложение
91
+ app = FastAPI()
92
+
93
+ # Gradio интерфейс
94
+ iface = gr.Interface(
95
+ fn=predict_disease,
96
+ inputs=gr.Image(type="numpy", label="Загрузите изображение листа томата"),
97
+ outputs=gr.Textbox(label="Результат диагностики"),
98
+ title="Диагностика болезней томатов",
99
+ description="Загрузите изображение листа томата для определения заболевания"
100
+ )
101
+
102
+ # Маршрут для Gradio
103
+ @app.get("/")
104
+ def read_root():
105
+ return {"status": "Tomato Disease Classifier is running"}
106
+
107
+ # Запуск Gradio
108
+ if __name__ == "__main__":
109
+ iface.launch(server_name="0.0.0.0", server_port=7860)