import numpy as np from flask import Flask, request, render_template, jsonify from tensorflow.keras.models import load_model from tensorflow.keras.preprocessing import image from PIL import Image, ImageChops, ImageEnhance import io import base64 from util import base64_to_pil app = Flask(__name__) # Load the pre-trained model model = load_model('model/model_vgg16_pretrained_80_100-90.h5') def perform_ela(img, scale=10): ela_image = img.copy().convert('RGB') ela_image.save('temp_ela.jpg', 'JPEG', quality=90) ela_image = Image.open('temp_ela.jpg') diff = ImageChops.difference(img, ela_image) extrema = diff.getextrema() max_diff = max([ex[1] for ex in extrema]) scale_factor = 255.0 / max_diff diff = ImageEnhance.Brightness(diff).enhance(scale_factor) return diff def model_predict(img, model): img = img.resize((128, 128)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) # Menambah dimensi batch x = x.astype('float32') / 255.0 preds = model.predict(x) return preds @app.route('/', methods=['GET']) def index(): return render_template('index.html') @app.route('/predict', methods=['POST']) def predict(): try: if request.method == 'POST': # Get the image from POST request img = base64_to_pil(request.json) # Perform ELA ela_img = perform_ela(img) # Make prediction using ELA image preds = model_predict(ela_img, model) # Konversi prediksi dari nilai probabilitas menjadi kelas (0 atau 1) pred_class = np.argmax(preds, axis=1)[0] # Lakukan pengembalian hasil prediksi if pred_class == 0: hasil_label = 'Manipulasi' else: hasil_label = 'Real' hasil_prob = "{:.2f}".format(100 * np.max(preds)) return jsonify(result=hasil_label, probability=hasil_prob) else: return jsonify({'error': 'Only POST requests are accepted'}) except Exception as e: return jsonify({'error': str(e)}) if __name__ == '__main__': app.run(debug=True, use_reloader=False)