web_mangrove / controllerKlasifikasi.py
oriastanjung's picture
fix concurency and asyncronous request
0f4a8fd
raw
history blame contribute delete
No virus
4.68 kB
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
from helper.ekstraksiBentuk import ekstrakBentuk
from helper.ekstraksiTekstur import ekstrakTekstur
# import pickle
from scipy.spatial.distance import cdist
from numpy.linalg import pinv
labels = ['Avicennia alba', 'Bruguiera cylindrica', 'Bruguiera gymnorrhiza','Lumnitzora littorea', 'Rhizophora apiculata', 'Rhizophora mucronata','Scyphyphora hydrophyllacea', 'Senoratia alba', 'Xylocarpus granatum']
# Load data from CSV file
def load_data(file_path):
df = pd.read_csv(file_path)
return df
# Preprocess data
def preprocess_data(df):
# Extract features and labels
X = df[['Panjang','Keliling','Diameter','Luas','Faktor bentuk',
'ASM 0','ASM 45','ASM 90','ASM 135','Kontras 0','Kontras 45',
'Kontras 90','Kontras 135','IDM 0','IDM 45','IDM 90','IDM 135','Entropy 0','Entropy 45','Entropy 90',
'Entropy 135','Korelasi 0','Korelasi 45',
'Korelasi 90','Korelasi 135']].values
y = df['Jenis'].values
# Standardize features
scaler = MinMaxScaler()
X = scaler.fit_transform(X)
# Encode labels
label_encoder = LabelEncoder()
y = label_encoder.fit_transform(y)
return X, y, scaler, label_encoder # Return scaler along with X, y, and label_encoder
# Define the RBFN class for multi-class classification
class RBFNN:
def __init__(self, input_size, hidden_size, output_size):
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
self.centers = None
self.width = None
self.weights = None
def _gaussian(self, X, centers, width):
return np.exp(-cdist(X, centers) ** 2 / (2 * (width ** 2)))
def _one_hot_encoding(self, y):
one_hot = np.zeros((y.shape[0], self.output_size))
for i, val in enumerate(y):
one_hot[i, val] = 1
return one_hot
def fit(self, X, y):
# Initialize centers using K-means
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=self.hidden_size, random_state=42)
kmeans.fit(X)
self.centers = kmeans.cluster_centers_
# Calculate width
self.width = np.mean(cdist(self.centers, self.centers)) / np.sqrt(2 * self.hidden_size)
# Compute activations
phi = self._gaussian(X, self.centers, self.width)
# Solve for weights using Moore-Penrose pseudoinverse
phi_pseudo_inverse = pinv(phi)
one_hot_y = self._one_hot_encoding(y)
self.weights = np.dot(phi_pseudo_inverse, one_hot_y)
def predict(self, X):
phi = self._gaussian(X, self.centers, self.width)
predictions = np.dot(phi, self.weights)
return np.argmax(predictions, axis=1)
def save_model(self, file_path):
import pickle
with open(file_path, 'wb') as f:
pickle.dump((self.centers, self.width, self.weights), f)
@staticmethod
def load_model(file_path):
import pickle
with open(file_path, 'rb') as f:
centers, width, weights = pickle.load(f)
model = RBFNN(input_size=centers.shape[1], hidden_size=centers.shape[0], output_size=weights.shape[1])
model.centers = centers
model.width = width
model.weights = weights
return model
# Load and preprocess training data
train_file_path = "data_set.csv"
train_df = load_data(train_file_path)
X_train, y_train, scaler, label_encoder = preprocess_data(train_df)
# Load the model from the file
loaded_model = RBFNN.load_model('RBFNN_model.pkl')
def klasifikasiMangrove(image) :
major_axis_length,perimeter,diameter,area,shape_factor=ekstrakBentuk(image)
asm_result,kontras_result,idm_result,entropy_result,korelasi_result=ekstrakTekstur(image)
new_data = np.array([[major_axis_length,perimeter,diameter,area,shape_factor,asm_result[0],asm_result[1],asm_result[2],asm_result[3],kontras_result[0],kontras_result[1],kontras_result[2],kontras_result[3],idm_result[0],idm_result[1],idm_result[2],idm_result[3],entropy_result[0],entropy_result[1],entropy_result[2],entropy_result[3],korelasi_result[0],korelasi_result[1],korelasi_result[2],korelasi_result[3]]]) # Example
new_data_scaled = scaler.transform(new_data)
predicted_class = loaded_model.predict(new_data_scaled)
predicted_label = label_encoder.inverse_transform(predicted_class)
klasifikasi_mangrove =labels[predicted_label[0]-1]
id_mangrove = predicted_label[0]-1
print(major_axis_length,perimeter,diameter,area,shape_factor)
return klasifikasi_mangrove, id_mangrove