NikhilPatil commited on
Commit
f980dad
·
verified ·
1 Parent(s): 51a9f88

Upload 23 files

Browse files
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* 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
 
 
 
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
36
+ Main_py/banana_cnn_model.keras filter=lfs diff=lfs merge=lfs -text
37
+ Main_py/banana_vit_model.keras filter=lfs diff=lfs merge=lfs -text
.streamlit/config.toml ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [server]
2
+ headless = true
3
+ port = 8501
4
+ enableCORS = false
5
+
6
+ [theme]
7
+ base = "light"
8
+ primaryColor = "#00B86B"
9
+ backgroundColor = "#F0F2F6"
10
+ secondaryBackgroundColor = "#FFFFFF"
11
+ textColor = "#000000"
12
+ font = "sans serif"
Main_py/X_test_combined.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:837ed58b63a01c432b58dd21d12e7f26aa2872d66dd92097931150bf49975501
3
+ size 962688
Main_py/X_train_combined.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:381a666ba06e78e6f88c3a08a02c83cc7dbb0d77ae77a018b98c914a18b6f296
3
+ size 3846272
Main_py/banana_cnn_model.keras ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:db4edf6484881ee6e5a779d29f1c419295ae13f5eb4ca188278606dac5729b68
3
+ size 11599896
Main_py/banana_disease_knowledge_base.json ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "Crop": "Banana",
4
+ "Disease": "Sigatoka Leaf Spot",
5
+ "Local_Name": {
6
+ "mr": "सिगाटोका पाने डाग",
7
+ "hi": "सिगाटोका पत्ती धब्बा",
8
+ "en": "Sigatoka Leaf Spot"
9
+ },
10
+ "Symptoms": "Small dark streaks on leaves that expand into yellow or brown patches, reducing photosynthesis.",
11
+ "Symptoms_HI": "पत्तियों पर छोटे काले धब्बे जो पीले या भूरे रंग के धब्बों में बदल जाते हैं और प्रकाश संश्लेषण को कम करते हैं।",
12
+ "Symptoms_MR": "पानांवर लहान काळे ठिपके जे नंतर पिवळसर किंवा तपकिरी डागात रूपांतरित होतात आणि प्रकाशसंश्लेषण कमी करतात.",
13
+ "Cause": "Caused by the fungus Mycosphaerella musicola in warm, humid environments.",
14
+ "Cause_HI": "गर्म और नम वातावरण में Mycosphaerella musicola नामक कवक के कारण होता है।",
15
+ "Cause_MR": "Mycosphaerella musicola या बुरशीमुळे उष्ण व दमट हवामानात रोग होतो.",
16
+ "Pesticide_Recommendation": "Use Mancozeb fungicide weekly during the early stages.",
17
+ "Pesticide_Recommendation_HI": "प्रारंभिक चरण में साप्ताहिक रूप से Mancozeb फफूंदनाशी का उपयोग करें।",
18
+ "Pesticide_Recommendation_MR": "प्रारंभिक अवस्थेत दर आठवड्याला Mancozeb फंगिसाइड वापरा.",
19
+ "Pesticide": "Mancozeb",
20
+ "Pathogen": "Mycosphaerella musicola",
21
+ "Management_Practices": "Ensure plant spacing, remove infected leaves, and improve airflow in plantations.",
22
+ "Management_HI": "पौधों की उचित दूरी बनाए रखें, संक्रमित पत्तियों को हटा दें और खेत में वायु प्रवाह बढ़ाएं।",
23
+ "Management_MR": "झाडांमधील योग्य अंतर ठेवा, बाधित पाने काढा आणि हवा खेळती राहील याची खात्री करा."
24
+ },
25
+ {
26
+ "Crop": "Banana",
27
+ "Disease": "Cordana Leaf Spot",
28
+ "Local_Name": {
29
+ "mr": "कॉर्डाना पाने डाग",
30
+ "hi": "कॉर्डाना पत्ती धब्बा",
31
+ "en": "Cordana Leaf Spot"
32
+ },
33
+ "Symptoms": "Oval gray-white spots on older leaves that enlarge into necrotic patches.",
34
+ "Symptoms_HI": "पुरानी पत्तियों पर अंडाकार भूरे-सफेद धब्बे जो बाद में सड़न में बदल जाते हैं।",
35
+ "Symptoms_MR": "जुन्या पानांवर अंडाकृती करड्या-पांढऱ्या डागांचे निर्माण होते जे नंतर सडतात.",
36
+ "Cause": "Fungal disease favored by prolonged leaf wetness and poor drainage.",
37
+ "Cause_HI": "लंबे समय तक पत्तियों की नमी और खराब जल निकासी के कारण होने वाला फंगल रोग।",
38
+ "Cause_MR": "पानांवर जास्त वेळ ओलावा राहणे आणि निकृष्ट निचरा यामुळे होणारा बुरशीजन्य रोग.",
39
+ "Pesticide_Recommendation": "Apply fungicide on lower leaf surfaces every 10–14 days in humid weather.",
40
+ "Pesticide_Recommendation_HI": "नमी वाले मौसम में हर 10–14 दिन में निचली पत्तियों पर फफूंदनाशी छिड़कें।",
41
+ "Pesticide_Recommendation_MR": "दमट हवामानात दर 10–14 दिवसांनी खालच्या पानांवर फंगिसाइड फवारणी करा.",
42
+ "Pesticide": "Mancozeb",
43
+ "Pathogen": "Cordana musae",
44
+ "Management_Practices": "Improve drainage, apply mulching, and remove infected leaves.",
45
+ "Management_HI": "जल निकासी सुधारें, मल्चिंग करें और संक्रमित पत्तियों को हटा दें।",
46
+ "Management_MR": "निचरा सुधारावा, मल्चिंग करावी आणि बाधित पाने काढावीत."
47
+ },
48
+ {
49
+ "Crop": "Banana",
50
+ "Disease": "Pestalotiopsis Leaf Spot",
51
+ "Local_Name": {
52
+ "mr": "पेस्टालोटिओप्सिस पाने डाग",
53
+ "hi": "पेस्टालोटिओप्सिस पत्ती धब्बा",
54
+ "en": "Pestalotiopsis Leaf Spot"
55
+ },
56
+ "Symptoms": "Irregular brown to black leaf spots with yellow halos on leaf edges.",
57
+ "Symptoms_HI": "पत्तियों के किनारों पर पीले घेरे वाले अनियमित भूरे से काले रंग के धब्बे।",
58
+ "Symptoms_MR": "पानांच्या कडांवर पिवळ्या वलयांसह अनियमित तपकिरी ते काळे ठिपके.",
59
+ "Cause": "Spread by water splash in high humidity; Pestalotiopsis fungal infection.",
60
+ "Cause_HI": "उच्च आर्द्रता में पानी के छींटों से फैलने वाला पेस्टालोटिओप्सिस फंगल संक्रमण।",
61
+ "Cause_MR": "उच्च आर्द्रतेत पाण्याचे शिंपडल्यामुळे पसरणारा पेस्टालोटिओप्सिस बुरशी संसर्ग.",
62
+ "Pesticide_Recommendation": "Spray appropriate fungicide during early symptoms to control spread.",
63
+ "Pesticide_Recommendation_HI": "प्रारंभिक लक्षणों पर उपयुक्त फफूंदनाशी का छिड़काव करें।",
64
+ "Pesticide_Recommendation_MR": "लक्षणे दिसताच योग्य फंगिसाइड फवारणी करा.",
65
+ "Pesticide": "Propiconazole",
66
+ "Pathogen": "Pestalotiopsis species",
67
+ "Management_Practices": "Avoid overhead irrigation, prune old leaves, maintain field hygiene.",
68
+ "Management_HI": "ऊपरी सिंचाई से बचें, पुरानी पत्तियों को काटें और खेत की स्वच्छता बनाए रखें।",
69
+ "Management_MR": "वरून पाणी देणे टाळा, जुनी पाने छाटावीत आणि शेत स्वच्छ ठेवावे."
70
+ }
71
+ ]
Main_py/banana_disease_knowledge_base_DL.json ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "Crop": "Banana",
4
+ "Disease": "Sigatoka Leaf Spot",
5
+ "Local_Name": {
6
+ "mr": "सिगाटोका पाने डाग",
7
+ "hi": "सिगाटोका पत्ती धब्बा",
8
+ "en": "Sigatoka Leaf Spot"
9
+ },
10
+ "Symptoms_MR": "पानांवर लहान काळे ठिपके जे नंतर पिवळसर किंवा तपकिरी डागात रूपांतरित होतात आणि प्रकाशसंश्लेषण कमी करतात.",
11
+ "Cause_MR": "Mycosphaerella musicola या बुरशीमुळे उष्ण व दमट हवामानात रोग होतो.",
12
+ "Pesticide_Recommendation_MR": "प्रारंभिक अवस्थेत दर आठवड्याला Mancozeb फंगिसाइड वापरा.",
13
+ "Pesticide": "Mancozeb",
14
+ "Pathogen": "Mycosphaerella musicola",
15
+ "Management_Practices_MR": "झाडांमधील योग्य अंतर ठेवा, बाधित पाने काढा आणि हवा खेळती राहील याची खात्री करा."
16
+ },
17
+ {
18
+ "Crop": "Banana",
19
+ "Disease": "Cordana Leaf Spot",
20
+ "Local_Name": {
21
+ "mr": "कॉर्डाना पाने डाग",
22
+ "hi": "कॉर्डाना पत्ती धब्बा",
23
+ "en": "Cordana Leaf Spot"
24
+ },
25
+ "Symptoms_MR": "जुन्या पानांवर अंडाकृती करड्या-पांढऱ्या डागांचे निर्माण होते जे नंतर सडतात.",
26
+ "Cause_MR": "पानांवर जास्त वेळ ओलावा राहणे आणि निकृष्ट निचरा यामुळे होणारा बुरशीजन्य रोग.",
27
+ "Pesticide_Recommendation_MR": "दमट हवामानात दर 10–14 दिवसांनी खालच्या पानांवर फंगिसाइड फवारणी करा.",
28
+ "Pesticide": "Mancozeb",
29
+ "Pathogen": "Cordana musae",
30
+ "Management_Practices_MR": "निचरा सुधारावा, मल्चिंग करावी आणि बाधित पाने काढावीत."
31
+ },
32
+ {
33
+ "Crop": "Banana",
34
+ "Disease": "Pestalotiopsis Leaf Spot",
35
+ "Local_Name": {
36
+ "mr": "पेस्टालोटिओप्सिस पाने डाग",
37
+ "hi": "पेस्टालोटिओप्सिस पत्ती धब्बा",
38
+ "en": "Pestalotiopsis Leaf Spot"
39
+ },
40
+ "Symptoms_MR": "पानांच्या कडांवर पिवळ्या वलयांसह अनियमित तपकिरी ते काळे ठिपके.",
41
+ "Cause_MR": "उच्च आर्द्रतेत पाण्याचे शिंपडल्यामुळे पसरणारा पेस्टालोटिओप्सिस बुरशी संसर्ग.",
42
+ "Pesticide_Recommendation_MR": "लक्षणे दिसताच योग्य फंगिसाइड फवारणी करा.",
43
+ "Pesticide": "Propiconazole",
44
+ "Pathogen": "Pestalotiopsis species",
45
+ "Management_Practices_MR": "वरून पाणी देणे टाळा, जुनी पाने छाटावीत आणि शेत स्वच्छ ठेवावे."
46
+ },
47
+ {
48
+ "Crop": "Banana",
49
+ "Disease": "Healthy",
50
+ "Local_Name": {
51
+ "mr": "निरोगी",
52
+ "hi": "स्वस्थ",
53
+ "en": "Healthy"
54
+ },
55
+ "Symptoms_MR": "पाने हिरवी, स्वच्छ आणि कोणतेही डाग किंवा पिवळेपणा नसलेली.",
56
+ "Cause_MR": "कोणताही रोग किंवा संसर्ग नाही.",
57
+ "Pesticide_Recommendation_MR": "फवारणीची आवश्यकता नाही; नियमित देखभाल करा.",
58
+ "Pesticide": "None",
59
+ "Pathogen": "None",
60
+ "Management_Practices_MR": "नियमित पाणी देणे, खतांचा वापर आणि शेत स्वच्छता राखणे."
61
+ }
62
+ ]
Main_py/banana_vit_model.keras ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ee9e21dd30da1ad9b49ee3344686f10f8c61576990d70899e92d28498195eb7b
3
+ size 344759504
Main_py/catboost_model.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:57f287dec025ecd3e0a8aad6fac28f6b5ca8e77e5d575ebca07a03bf220b0846
3
+ size 818158
Main_py/cnn_test_features.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6d8f0f0d3e2e534df6b8639d1096d12237514eb26fff0a11a7d4111f0995487d
3
+ size 481408
Main_py/cnn_train_features.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:396485ea2f1463d2f175726ae4b1b21826dfc52c60e5eca3d395bf32de1948c5
3
+ size 1923200
Main_py/feature_scaler.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9fbc18d13a02f8408572684f317ccf0462a24644e437122abfe945a33c17d984
3
+ size 6759
Main_py/isolation_forest.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2787fb3f46c0847289b62ecdaf4414645a6ea00b0a6217465f5964efda575eaa
3
+ size 401912
Main_py/label_encoder.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:fd187c3fba3dce430950a9b60c86f7d949413695b9aa8c75bfc2977cbe97171e
3
+ size 460
Main_py/lightgbm_model.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:117fd9c8be51dabcd05b64997e037d7ee282abc0a7ed813af18fe98a3011335e
3
+ size 1012100
Main_py/mlp_model.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0d81f6c8f2d7f454c5c4d6f660419f4bc9eb8bdc27ae891ce7e5125a2306c0f4
3
+ size 669184
Main_py/randomforest_model.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c3b24b5af2a7412d13e459d731552ece8bd7ffe31f15141defaefb0627c30f2b
3
+ size 2960697
Main_py/vit_labels.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:852a1dc254e17ce581018994afce63f52482ff1ebeae749adf3683ecf9cd303b
3
+ size 37696
Main_py/vit_test_features.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:622ebeded5baf867e0347a91444f33c526dcf27af3b78ca2cea97a1eb3a3960a
3
+ size 481408
Main_py/vit_train_features.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:aa0a9c072064a737c48bcc6f67844cddedec0f17b10bf3f7370041640a8d8924
3
+ size 1923200
Main_py/xgboost_model.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3cf56d66f917d16dc757601c03c6cf2f3f3fdc6a499390905d29de806fb8ccf4
3
+ size 899969
app.py ADDED
@@ -0,0 +1,187 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import cv2
3
+ import numpy as np
4
+ import os
5
+ import json
6
+ import joblib
7
+ import pickle
8
+ from typing import Dict, Any
9
+ from sentence_transformers import SentenceTransformer, CrossEncoder
10
+ from langdetect import detect
11
+ from tensorflow.keras.models import Model, load_model
12
+ from tensorflow.keras.applications.mobilenet_v2 import preprocess_input as mobilenet_preprocess
13
+ from vit_keras.layers import ClassToken, AddPositionEmbs, TransformerBlock
14
+
15
+ # ================== CACHING ==================
16
+ @st.cache_resource
17
+ def load_all_models():
18
+ cnn_model = load_model("Main_py/banana_cnn_model.keras", compile=False)
19
+ vit_model = load_model(
20
+ "Main_py/banana_vit_model.keras", compile=False,
21
+ custom_objects={
22
+ 'ClassToken': ClassToken,
23
+ 'AddPositionEmbs': AddPositionEmbs,
24
+ 'TransformerBlock': TransformerBlock
25
+ }
26
+ )
27
+ cnn_feat_ext = Model(inputs=cnn_model.input, outputs=cnn_model.get_layer(index=-4).output)
28
+ vit_feat_ext = Model(inputs=vit_model.input, outputs=vit_model.get_layer(index=-4).output)
29
+ return cnn_model, vit_model, cnn_feat_ext, vit_feat_ext
30
+
31
+ @st.cache_resource
32
+ def load_all_assets():
33
+ scaler = joblib.load("Main_py/feature_scaler.pkl")
34
+ mlp_model = joblib.load("Main_py/lightgbm_model.pkl")
35
+ outlier_detector = joblib.load("Main_py/isolation_forest.pkl")
36
+ with open("Main_py/label_encoder.pkl", "rb") as f:
37
+ le = pickle.load(f)
38
+ with open("Main_py/banana_disease_knowledge_base_DL.json", "r", encoding="utf-8") as f:
39
+ kb_data_image = {entry["Disease"]: entry for entry in json.load(f)}
40
+ with open("Main_py/banana_disease_knowledge_base.json", "r", encoding="utf-8") as f:
41
+ kb_data_text = json.load(f)
42
+ return scaler, mlp_model, le, kb_data_image, kb_data_text, outlier_detector
43
+
44
+ @st.cache_resource
45
+ def load_nlp_models():
46
+ embedder = SentenceTransformer('sentence-transformers/paraphrase-xlm-r-multilingual-v1')
47
+ cross_encoder = CrossEncoder('cross-encoder/mmarco-mMiniLMv2-L12-H384-v1')
48
+ return embedder, cross_encoder
49
+
50
+ # ================== IMAGE DIAGNOSIS ==================
51
+ def identify_disease_from_image(image_path):
52
+ try:
53
+ img = cv2.imread(image_path)
54
+ if img is None:
55
+ raise ValueError("Image not loaded.")
56
+ img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
57
+ img_resized = cv2.resize(img_rgb, (224, 224))
58
+
59
+ cnn_input = np.expand_dims(img_resized / 255.0, axis=0)
60
+ vit_input = np.expand_dims(mobilenet_preprocess(img_resized), axis=0)
61
+
62
+ cnn_feat = cnn_feature_extractor.predict(cnn_input, verbose=0)
63
+ vit_feat = vit_feature_extractor.predict(vit_input, verbose=0)
64
+ combined_feat = np.concatenate([cnn_feat, vit_feat], axis=1)
65
+ combined_scaled = scaler.transform(combined_feat)
66
+
67
+ y_pred = mlp_model.predict(combined_scaled)
68
+ predicted_label = le.inverse_transform(y_pred)[0]
69
+
70
+ confidence = None
71
+ try:
72
+ probs = mlp_model.predict_proba(combined_scaled)
73
+ confidence = np.max(probs)
74
+ except:
75
+ probs = None
76
+
77
+ st.image(img_rgb, caption="Uploaded Image", use_column_width=True)
78
+ st.write(f"**Predicted Disease**: {predicted_label} ({confidence:.2f} confidence)" if confidence else predicted_label)
79
+
80
+ result = {
81
+ "predicted_disease": predicted_label,
82
+ "confidence": confidence,
83
+ "info_available": False,
84
+ "all_probabilities": probs[0].tolist() if probs is not None else None
85
+ }
86
+
87
+ normalized_pred = predicted_label.lower().replace(" ", "")
88
+ for disease in kb_data_image:
89
+ if normalized_pred in disease.lower().replace(" ", ""):
90
+ matched = kb_data_image[disease]
91
+ result["info_available"] = True
92
+ st.subheader("Image-Based Prediction (Marathi)")
93
+ st.write(f"**रोग**: {matched['Local_Name']['mr']}")
94
+ st.write(f"**लक्षणे**: {matched['Symptoms_MR']}")
95
+ st.write(f"**कारण**: {matched['Cause_MR']}")
96
+ st.write(f"**कीटकनाशक शिफारस**: {matched['Pesticide_Recommendation_MR']}")
97
+ st.write(f"**कीटकनाशक**: {matched['Pesticide']}")
98
+ st.write(f"**परजीवी**: {matched['Pathogen']}")
99
+ st.write(f"**व्यवस्थापन उपाय**: {matched['Management_Practices_MR']}")
100
+ break
101
+ else:
102
+ st.warning("❌ Disease not found in knowledge base.")
103
+ return result
104
+
105
+ except Exception as e:
106
+ st.error(f"Error: {e}")
107
+ return {"error": str(e), "predicted_disease": None}
108
+
109
+ # ================== TEXT DIAGNOSIS ==================
110
+ def detect_language(query: str) -> str:
111
+ try:
112
+ lang = detect(query)
113
+ return lang if lang in ["mr", "hi"] else "en"
114
+ except:
115
+ return "en"
116
+
117
+ def predict_disease(query: str) -> Dict[str, Any]:
118
+ lang = detect_language(query)
119
+ query_emb = embedder.encode([query], normalize_embeddings=True)
120
+ symptom_key = f"Symptoms_{lang.upper()}" if lang != "en" else "Symptoms"
121
+ pairs = [[query, entry[symptom_key]] for entry in kb_data_text]
122
+ scores = cross_encoder.predict(pairs)
123
+ best_idx = np.argmax(scores)
124
+
125
+ if scores[best_idx] < 0.2:
126
+ return {
127
+ "message": {
128
+ "mr": "हा रोग आमच्या डेटाबेसमध्ये नाही.",
129
+ "hi": "यह रोग हमारे डेटाबेस में नहीं है।",
130
+ "en": "This disease is not in our database."
131
+ }[lang]
132
+ }
133
+
134
+ entry = kb_data_text[best_idx]
135
+ return {
136
+ "Crop": entry["Crop"],
137
+ "Disease": entry["Local_Name"][lang],
138
+ "Symptoms": entry[symptom_key],
139
+ "Cause": entry.get(f"Cause_{lang.upper()}", entry["Cause"]),
140
+ "Pesticide_Recommendation": entry.get(f"Pesticide_Recommendation_{lang.upper()}", entry["Pesticide_Recommendation"]),
141
+ "Pesticide": entry["Pesticide"],
142
+ "Pathogen": entry["Pathogen"],
143
+ "Management_Practices": entry.get(f"Management_{lang.upper()}", entry["Management_Practices"])
144
+ }
145
+
146
+ # ================== UI ==================
147
+ st.set_page_config(page_title="Banana Disease Detection", layout="centered")
148
+
149
+ st.title("🍌 Banana Disease Detection App")
150
+ st.write("Detect banana crop diseases using image or symptom query in Marathi, Hindi, or English.")
151
+
152
+ option = st.radio("Choose input method:", ("Image Only", "Text Only", "Both"))
153
+
154
+ # Load all models & assets once
155
+ cnn_model, vit_model, cnn_feature_extractor, vit_feature_extractor = load_all_models()
156
+ scaler, mlp_model, le, kb_data_image, kb_data_text, outlier_detector = load_all_assets()
157
+ embedder, cross_encoder = load_nlp_models()
158
+
159
+ # Image input
160
+ if option in ["Image Only", "Both"]:
161
+ st.subheader("📷 Upload Banana Leaf Image")
162
+ uploaded_image = st.file_uploader("Upload Image", type=["jpg", "jpeg", "png"])
163
+ if uploaded_image:
164
+ temp_path = "temp_image.jpg"
165
+ with open(temp_path, "wb") as f:
166
+ f.write(uploaded_image.getbuffer())
167
+ identify_disease_from_image(temp_path)
168
+ os.remove(temp_path)
169
+
170
+ # Text input
171
+ if option in ["Text Only", "Both"]:
172
+ st.subheader("📝 Enter Symptoms")
173
+ symptoms = st.text_area("Describe the symptoms (Marathi, Hindi, or English):")
174
+ if symptoms and st.button("Predict Disease from Text"):
175
+ result = predict_disease(symptoms)
176
+ if "message" in result:
177
+ st.warning(result["message"])
178
+ else:
179
+ st.subheader("Text-Based Prediction")
180
+ st.write(f"**Crop**: {result['Crop']}")
181
+ st.write(f"**Disease**: {result['Disease']}")
182
+ st.write(f"**Symptoms**: {result['Symptoms']}")
183
+ st.write(f"**Cause**: {result['Cause']}")
184
+ st.write(f"**Pesticide Recommendation**: {result['Pesticide_Recommendation']}")
185
+ st.write(f"**Pesticide**: {result['Pesticide']}")
186
+ st.write(f"**Pathogen**: {result['Pathogen']}")
187
+ st.write(f"**Management Practices**: {result['Management_Practices']}")
requirements.txt ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ streamlit==1.35.0
2
+ tensorflow==2.11.0 # ⚠️ Use this version instead of 2.12.0
3
+ opencv-python==4.11.0.86
4
+ numpy==1.23.5
5
+ pandas==2.3.0
6
+ matplotlib==3.10.3
7
+ scikit-learn==1.7.0
8
+ xgboost==3.0.2
9
+ seaborn==0.13.2
10
+ vit-keras==0.1.2
11
+ transformers==4.52.4
12
+ sentence-transformers==4.1.0
13
+ langdetect==1.0.9
14
+ joblib==1.5.1
runtime.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ python-3.10