TIF_E41200505/app.py

73 lines
2.1 KiB
Python

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)