73 lines
2.1 KiB
Python
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) |