File size: 5,012 Bytes
8f6d05a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import joblib
import numpy as np
import tensorflow as tf
from .llm import LLM
from .config import *
from .exception import log_exception, ModelLoadingError, PreprocessingError, PredictionError
from .logger import get_logger

logger = get_logger(__name__)

class DataPreprocessor:
    def __init__(self):
        try:
            self.scaler = joblib.load(f"{MODELS_DIR}/scaler_object.joblib")
            logger.info("DataPreprocessor initialized with scaler.")
        except Exception as e:
            log_exception(e, "Error loading scaler in DataPreprocessor.")
            raise ModelLoadingError("Could not load the scaler for data preprocessing.") from e

    def preprocess(self, input_data):
        try:
            scaled_data = self.scaler.transform(np.array(input_data).reshape(1, -1))
            logger.info("Data preprocessing completed successfully.")
            return scaled_data
        except Exception as e:
            log_exception(e, "Error in preprocessing data in DataPreprocessor.")
            raise PreprocessingError("Preprocessing failed. Ensure input data format is correct.") from e


class ML_Model_Predictor:
    def __init__(self):
        try:
            self.model = joblib.load(f"{MODELS_DIR}/randomforest_best_model.pkl")
            logger.info("ML model loaded successfully.")
        except Exception as e:
            log_exception(e, "Failed to load ML model in ML_Model_Predictor.")
            raise ModelLoadingError("Could not load ML model. Please check model path and format.") from e

    def predict(self, preprocessed_data):
        try:
            prediction = self.model.predict(preprocessed_data)
            logger.info("ML model prediction completed successfully.")
            return prediction[0]
        except Exception as e:
            log_exception(e, "Error during ML model prediction in ML_Model_Predictor.")
            raise PredictionError("Prediction failed. Ensure input data format is correct.") from e


class CNN_Model_Predictor:
    def __init__(self):
        try:
            self.model = tf.keras.models.load_model(f"{MODELS_DIR}/mobilenet_lumpy_skin_model.h5")
            logger.info("CNN model loaded successfully.")
        except Exception as e:
            log_exception(e, "Failed to load CNN model in CNN_Model_Predictor.")
            raise ModelLoadingError("Could not load CNN model. Please check model path and format.") from e

    def predict(self, image):
        try:
            image = image.resize((224, 224))
            image_array = np.array(image) / 255.0
            image_array = np.expand_dims(image_array, axis=0)
            image_array = tf.keras.applications.mobilenet_v2.preprocess_input(image_array)
            prediction = self.model.predict(image_array)
            logger.info("CNN model prediction completed successfully.")
            return np.argmax(prediction, axis=1)[0]
        except Exception as e:
            log_exception(e, "Error during CNN model prediction in CNN_Model_Predictor.")
            raise PredictionError("CNN prediction failed. Check image input format.") from e


def prediction(image, longitude, latitude, cloud_cover, evapotranspiration, precipitation, min_temp, mean_temp, max_temp, vapour_pressure, wet_day_freq):
    try:
        # Initialize classes
        preprocessor = DataPreprocessor()
        ml_predictor = ML_Model_Predictor()
        cnn_predictor = CNN_Model_Predictor()
        llm = LLM()
        
        # Prepare structured data input for ML model
        structured_data = [longitude, latitude, cloud_cover, evapotranspiration, precipitation, min_temp, mean_temp, max_temp, vapour_pressure, wet_day_freq]
        preprocessed_data = preprocessor.preprocess(structured_data)
        
        # Get predictions from ML and CNN models
        ml_prediction = ml_predictor.predict(preprocessed_data)
        cnn_prediction = cnn_predictor.predict(image)
    
        result = f"""
        Lumpy Skin Disease Diagnostic Report:
        
        **ML Model Prediction:** {'Lumpy' if ml_prediction == 1 else 'Not Lumpy'}
        **CNN Model Prediction:** {'Lumpy' if cnn_prediction == 1 else 'Not Lumpy'}
        
        **Input Data:**
        - Longitude: {longitude}
        - Latitude: {latitude}
        - Monthly Cloud Cover: {cloud_cover}
        - Potential EvapoTranspiration: {evapotranspiration}
        - Precipitation: {precipitation}
        - Minimum Temperature: {min_temp}
        - Mean Temperature: {mean_temp}
        - Maximum Temperature: {max_temp}
        - Vapour Pressure: {vapour_pressure}
        - Wet Day Frequency: {wet_day_freq}
        """

        # Generate LLM report
        report = llm.inference(image=image, result=result)
        logger.info("LLM report generated successfully.")
        return report
    
    except Exception as e:
        log_exception(e, "Error in prediction function.")
        raise PredictionError("Prediction function encountered an error. Check inputs and model paths.") from e