Spaces:
Running
Running
Upload 23 files
Browse files- .gitattributes +2 -0
- .streamlit/config.toml +12 -0
- Main_py/X_test_combined.npy +3 -0
- Main_py/X_train_combined.npy +3 -0
- Main_py/banana_cnn_model.keras +3 -0
- Main_py/banana_disease_knowledge_base.json +71 -0
- Main_py/banana_disease_knowledge_base_DL.json +62 -0
- Main_py/banana_vit_model.keras +3 -0
- Main_py/catboost_model.pkl +3 -0
- Main_py/cnn_test_features.npy +3 -0
- Main_py/cnn_train_features.npy +3 -0
- Main_py/feature_scaler.pkl +3 -0
- Main_py/isolation_forest.pkl +3 -0
- Main_py/label_encoder.pkl +3 -0
- Main_py/lightgbm_model.pkl +3 -0
- Main_py/mlp_model.pkl +3 -0
- Main_py/randomforest_model.pkl +3 -0
- Main_py/vit_labels.npy +3 -0
- Main_py/vit_test_features.npy +3 -0
- Main_py/vit_train_features.npy +3 -0
- Main_py/xgboost_model.pkl +3 -0
- app.py +187 -0
- requirements.txt +14 -0
- runtime.txt +1 -0
.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
|