| import os |
| import numpy as np |
| import cv2 |
| import pickle |
| import tensorflow as tf |
| from flask import Flask, request, render_template_string |
| from skimage.feature import hog |
|
|
| app = Flask(__name__) |
|
|
| |
| MODEL_PATH = 'day_night_model.h5' |
| SCALER_PATH = 'scaler.pkl' |
|
|
| try: |
| model = tf.keras.models.load_model(MODEL_PATH) |
| with open(SCALER_PATH, 'rb') as f: |
| scaler = pickle.load(f) |
| print("✅ System Loaded Successfully") |
| except Exception as e: |
| print(f"❌ Error loading system: {e}") |
|
|
| def preprocess_image(image_bytes): |
| |
| nparr = np.frombuffer(image_bytes, np.uint8) |
| img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) |
| |
| |
| img = cv2.resize(img, (256, 256)) |
| gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) |
| |
| hog_feat = hog(gray, orientations=9, pixels_per_cell=(8,8), |
| cells_per_block=(2,2), block_norm='L2-Hys', |
| visualize=False, feature_vector=True) |
| |
| return scaler.transform(hog_feat.reshape(1, -1)) |
|
|
| @app.route('/', methods=['GET']) |
| def home(): |
| return render_template_string(''' |
| <div style="text-align:center; padding:50px;"> |
| <h1>Day vs Night Classifier</h1> |
| <form action="/predict" method="post" enctype="multipart/form-data"> |
| <input type="file" name="file" required><br><br> |
| <button type="submit">Prediksi</button> |
| </form> |
| </div> |
| ''') |
|
|
| @app.route('/predict', methods=['POST']) |
| def predict(): |
| try: |
| file = request.files['file'] |
| data = preprocess_image(file.read()) |
| prediction = model.predict(data)[0][0] |
| |
| label = "Day (Siang)" if prediction > 0.5 else "Night (Malam)" |
| return f"<h2 style='text-align:center'>Hasil: {label}</h2><center><a href='/'>Kembali</a></center>" |
| except Exception as e: |
| return f"Error: {e}" |
|
|
| if __name__ == '__main__': |
| |
| app.run(host='0.0.0.0', port=7860) |