first commit
|
@ -0,0 +1,175 @@
|
|||
from flask import Flask, render_template, request, redirect, url_for, jsonify
|
||||
import os
|
||||
import base64
|
||||
import tensorflow as tf
|
||||
from tensorflow import keras
|
||||
from keras import preprocessing
|
||||
import numpy as np
|
||||
import cv2
|
||||
from werkzeug.utils import secure_filename
|
||||
import time
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config["UPLOAD_FOLDER"] = "static/uploads/"
|
||||
|
||||
# folder static/uploads
|
||||
if not os.path.exists(app.config["UPLOAD_FOLDER"]):
|
||||
os.makedirs(app.config["UPLOAD_FOLDER"])
|
||||
|
||||
# Load model Hard Cascade Classifier
|
||||
tomato_cascade = cv2.CascadeClassifier("model/tomato_classifier.xml")
|
||||
|
||||
# Load kedua model klasifikasi
|
||||
#model_ripe = keras.models.load_model("model/CNN MobileNetV2-epochs10new-100.0.h5")
|
||||
#model_fresh = keras.models.load_model("model/CNN MobileNetV2-epochs10kesegaran-99.66.h5")
|
||||
|
||||
modl_newgen = keras.models.load_model("model/CNN MobileNetV2-epochs5newgen-99.41.h5")
|
||||
|
||||
# Fungsi deteksi tomat
|
||||
def is_tomato(img_path):
|
||||
"""Deteksi apakah gambar mengandung tomat atau tidak"""
|
||||
img = cv2.imread(img_path)
|
||||
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
||||
tomatoes = tomato_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
|
||||
return len(tomatoes) > 0
|
||||
|
||||
# Fungsi prediksi gambar
|
||||
def predict_image(img_path, model, class_names):
|
||||
img = preprocessing.image.load_img(img_path, target_size=(224, 224))
|
||||
img_array = preprocessing.image.img_to_array(img)
|
||||
img_array = np.expand_dims(img_array, axis=0)
|
||||
img_array /= 255.0
|
||||
predictions = model.predict(img_array)
|
||||
result = np.argmax(predictions, axis=1)
|
||||
confidence = int(np.max(predictions) * 100)
|
||||
return class_names[result[0]], confidence
|
||||
|
||||
@app.route("/")
|
||||
def index():
|
||||
return render_template("index.html")
|
||||
|
||||
@app.route("/upload", methods=["GET", "POST"])
|
||||
def upload():
|
||||
if request.method == "POST":
|
||||
# Proses file unggahan
|
||||
if 'file' not in request.files:
|
||||
return render_template("upload.html", error="Tidak ada file yang dipilih.")
|
||||
|
||||
file = request.files['file']
|
||||
if file.filename == '':
|
||||
return render_template("upload.html", error="Nama file kosong. Silakan pilih file lain.")
|
||||
|
||||
if file:
|
||||
filename = secure_filename(file.filename)
|
||||
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
|
||||
file.save(filepath)
|
||||
|
||||
# Validasi gambar menggunakan Hard Cascade
|
||||
if not is_tomato(filepath):
|
||||
return render_template("upload.html", error="Gambar yang diunggah bukan tomat. Harap unggah gambar tomat.")
|
||||
|
||||
# Simpan path gambar di sesi sementara untuk ditampilkan di halaman hasil
|
||||
return redirect(url_for("predict", img_path=filename))
|
||||
|
||||
return render_template("upload.html")
|
||||
|
||||
@app.route("/predict", methods=["GET", "POST"])
|
||||
def predict():
|
||||
if request.method == "POST":
|
||||
# Tangani data gambar dari kamera
|
||||
data = request.get_json()
|
||||
if data and "image" in data:
|
||||
# Decode Base64 menjadi file gambar
|
||||
image_data = data["image"].split(",")[1]
|
||||
image_bytes = base64.b64decode(image_data)
|
||||
filename = f"camera_{int(time.time())}.png"
|
||||
filepath = os.path.join(app.config["UPLOAD_FOLDER"], filename)
|
||||
|
||||
# Simpan gambar ke folder uploads
|
||||
with open(filepath, "wb") as f:
|
||||
f.write(image_bytes)
|
||||
|
||||
# Validasi gambar menggunakan Hard Cascade
|
||||
if not is_tomato(filepath):
|
||||
return jsonify({"success": False, "error": "Gambar yang diambil bukan tomat. Harap ambil gambar tomat."}), 400
|
||||
|
||||
# Lakukan prediksi setelah validasi
|
||||
#class_names_ripe = ['Belum Matang', 'Matang']
|
||||
#class_names_fresh = ['Busuk', 'Segar']
|
||||
|
||||
class_names_tomat = ['Matang Busuk', 'Matang Segar', 'Mentah Busuk', 'Mentah Segar']
|
||||
|
||||
# Prediksi kematangan
|
||||
#predicted_class_ripe, confidence_ripe = predict_image(filepath, model_ripe, class_names_ripe)
|
||||
|
||||
# Prediksi kesegaran
|
||||
#predicted_class_fresh, confidence_fresh = predict_image(filepath, model_fresh, class_names_fresh)
|
||||
|
||||
predicted_class_tomat, confidence_tomat = predict_image(filepath, modl_newgen, class_names_tomat)
|
||||
|
||||
# Gabungkan hasil prediksi
|
||||
#predicted_class = f"{predicted_class_tomat}"
|
||||
#average_confidence = round((confidence_ripe + confidence_fresh) / 2, 2)
|
||||
|
||||
# Kirim hasil prediksi sebagai respons JSON
|
||||
return jsonify({
|
||||
"success": True,
|
||||
"filename": filename,
|
||||
"predicted_class": predicted_class_tomat,
|
||||
"confidence": confidence_tomat
|
||||
})
|
||||
|
||||
return jsonify({"success": False, "error": "No valid image data received"}), 400
|
||||
|
||||
# Tangani metode GET untuk menampilkan halaman prediksi
|
||||
img_path = request.args.get("img_path")
|
||||
if not img_path:
|
||||
return redirect(url_for("upload"))
|
||||
|
||||
filepath = os.path.join(app.config["UPLOAD_FOLDER"], img_path)
|
||||
if not os.path.exists(filepath):
|
||||
return redirect(url_for("upload"))
|
||||
|
||||
#class_names_ripe = ['Belum Matang', 'Matang']
|
||||
#class_names_fresh = ['Busuk', 'Segar']
|
||||
|
||||
class_names_tomat = ['Matang Busuk', 'Matang Segar', 'Mentah Busuk', 'Mentah Segar']
|
||||
|
||||
# Prediksi kematangan
|
||||
#predicted_class_ripe, confidence_ripe = predict_image(filepath, model_ripe, class_names_ripe)
|
||||
|
||||
# Prediksi kesegaran
|
||||
#predicted_class_fresh, confidence_fresh = predict_image(filepath, model_fresh, class_names_fresh)
|
||||
|
||||
#predicted_class = f"{predicted_class_ripe} & {predicted_class_fresh}"
|
||||
#average_confidence = round((confidence_ripe + confidence_fresh) / 2, 2)
|
||||
|
||||
predicted_class_tomat, confidence_tomat = predict_image(filepath, modl_newgen, class_names_tomat)
|
||||
|
||||
local_time = time.localtime(time.time())
|
||||
data_date = time.strftime("%d-%m-%Y", local_time)
|
||||
data_time = time.strftime("%H:%M:%S", local_time)
|
||||
|
||||
return render_template(
|
||||
"predict.html",
|
||||
img_path=img_path,
|
||||
predicted_class=predicted_class_tomat,
|
||||
confidence=confidence_tomat,
|
||||
data_date=data_date,
|
||||
data_time=data_time
|
||||
)
|
||||
|
||||
@app.route("/more")
|
||||
def more():
|
||||
return render_template("more.html")
|
||||
|
||||
@app.route("/faq")
|
||||
def faq():
|
||||
return render_template("faq.html")
|
||||
|
||||
@app.route("/about")
|
||||
def about():
|
||||
return render_template("about.html")
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(host="0.0.0.0", port=5000, debug=True)
|
|
@ -0,0 +1,31 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIFazCCA1OgAwIBAgIUBBUH7GVLZnSlzG8fGUoKKpI4BkMwDQYJKoZIhvcNAQEL
|
||||
BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
|
||||
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yNTAyMjAxMjQyMTNaFw0yNjAy
|
||||
MjAxMjQyMTNaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
|
||||
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggIiMA0GCSqGSIb3DQEB
|
||||
AQUAA4ICDwAwggIKAoICAQCgArV1UD1SVwrNLyhMJWsMKxCPVLXwtjytrcce0Zp1
|
||||
lAH4tzuRZSOZftMQoINzy1IjxqWNmcID3vh9N3sZLUExytlDTQ8/eUhlzT1Ob9j4
|
||||
76Xjm/xTI3enmH7+GJSkeRicqcCdJ11f36q+XOOQNrzz8JUqLiheNKbF7aBMpPGB
|
||||
5fBLQPFaSp7O0a9VEsVD8f7fZo+I2X0stpkU+laqd4In5pBjt9PIluBU28hnewJX
|
||||
4NU5ByLcy8miKIiKJX3ZV0jFzgtwgSMp0sbhwKgorvZ0cJFD7hJFnaB4qE0HMckl
|
||||
a82x0sQ/TQ/BSnuGD339zoeiLQdSclroiwNFO80QcVbfpOIiZq4egA9AR9B3jPCd
|
||||
XgOxwffFkTyuXWmMmROBCcVaAM/BA33FJFupktvWSM2YXsy2m3b+/23t35/GwFB0
|
||||
ZkMQBHkHwqZgAlB4xAl6LFzvM0g/wObbtHeFUpXzZ+g5HO1Ou3THhSU9TzE6IVyg
|
||||
15F1uHQeBkGW6CBGyq9Vkggqh5rF6vwLgQhKFFDyFYDihu3Z8e5kvnD2XEoVv7fK
|
||||
yHCMSoY/T71FtSgclknQZmgkYnyjY2d2k/SP5yRy4/BdPoeQqkli7JoUu8jWoNXo
|
||||
YPTsrhAcj5FBrBx6QhhroxWF5vFWlKtmj65UkEI0O0Otqb/waxAw8+WdwjnhVWHm
|
||||
bwIDAQABo1MwUTAdBgNVHQ4EFgQU+b5d0PkP+HLsJ07q4uMys8KojxcwHwYDVR0j
|
||||
BBgwFoAU+b5d0PkP+HLsJ07q4uMys8KojxcwDwYDVR0TAQH/BAUwAwEB/zANBgkq
|
||||
hkiG9w0BAQsFAAOCAgEAgC2TZgbOYO4mNPLdK/YU7JUcPhzuyLsC9ub4w7HL2brB
|
||||
VKCLf4i+3yvNdaXDR2VAhN1TluMjILTJi1P4ognLCrvchBf0Fa0wSCUoR+fA88g8
|
||||
IBsbMiVdjSyfOwfyByR+45/Ma13uGjavC1ArPIGMX6qro40gsYoBYY36IhgxS23r
|
||||
LKjDeAo44pRCVX/r+2i0NZpwwckEK0Gx8v0CYAojGZ1l7SrNbGSYsX/lzB1KWkZA
|
||||
lVYNvbMG1V89UhxHxj1Ye7Yc21IMXuLe2Eu8WgV9WblndXO4vupVqr/iwMbtYx4f
|
||||
zy54fK8MsNYGbPlEK9ZLHFgs3k6jT+qLSKA9/PiSk3ZhJTrgjsOsP5Hh2x3LDGEy
|
||||
WoLA8DuOgyr6k/arz1jeltZPSVjeJNTz9g8XECeHJyQE+fVd8ByJKdQj9qwKgxxl
|
||||
YIuccwru6dEIgcqlNCLl5NplTBHnwVwlEUaRtoAnsnEcDQB1Je/4XFCo2sSC1y8l
|
||||
P8o5zbnJVKdqJ1CmZLhoEjQxas7IWHydGhGVoA7/t0yW7HRHwvhLzxtNbGErPMR1
|
||||
ECQaA+2zImiBO4oJA/dXc54cDi+P/iLZSflxgHEp/5r2ujhOQ0Nbiu7L/Do7z5gC
|
||||
aA+Ch5W9ESkdQwMjbzkXFRiQdyUQkWw3oX2YsoO8l6k7xJu9moezdyPrBzEkGPo=
|
||||
-----END CERTIFICATE-----
|
|
@ -0,0 +1,52 @@
|
|||
-----BEGIN PRIVATE KEY-----
|
||||
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
|
||||
EPmju7tZZ4jK6tFhrXacBTGOFfdVbZw=
|
||||
-----END PRIVATE KEY-----
|
|
@ -0,0 +1,6 @@
|
|||
<hr class="my-4">
|
||||
{% if error %}
|
||||
<div class="alert alert-danger" role="alert">
|
||||
{{ error }}
|
||||
</div>
|
||||
{% endif %}
|
After Width: | Height: | Size: 1006 KiB |
After Width: | Height: | Size: 101 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 28 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 52 KiB |
After Width: | Height: | Size: 907 KiB |
After Width: | Height: | Size: 84 KiB |
After Width: | Height: | Size: 2.4 MiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 1.0 MiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 95 KiB |
After Width: | Height: | Size: 42 KiB |
After Width: | Height: | Size: 8.1 KiB |
After Width: | Height: | Size: 90 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 118 KiB |
After Width: | Height: | Size: 120 KiB |
After Width: | Height: | Size: 72 KiB |
After Width: | Height: | Size: 107 KiB |
After Width: | Height: | Size: 126 KiB |
After Width: | Height: | Size: 126 KiB |
After Width: | Height: | Size: 179 KiB |
After Width: | Height: | Size: 137 KiB |
After Width: | Height: | Size: 179 KiB |
After Width: | Height: | Size: 107 KiB |
After Width: | Height: | Size: 119 KiB |
After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 105 KiB |
After Width: | Height: | Size: 100 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 47 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 31 KiB |
After Width: | Height: | Size: 41 KiB |
After Width: | Height: | Size: 398 KiB |
After Width: | Height: | Size: 412 KiB |
After Width: | Height: | Size: 414 KiB |
After Width: | Height: | Size: 387 KiB |
After Width: | Height: | Size: 394 KiB |
After Width: | Height: | Size: 413 KiB |
After Width: | Height: | Size: 395 KiB |
After Width: | Height: | Size: 195 KiB |
After Width: | Height: | Size: 394 KiB |
After Width: | Height: | Size: 400 KiB |
After Width: | Height: | Size: 373 KiB |
After Width: | Height: | Size: 403 KiB |
After Width: | Height: | Size: 183 KiB |
After Width: | Height: | Size: 364 KiB |
After Width: | Height: | Size: 486 KiB |
After Width: | Height: | Size: 492 KiB |
After Width: | Height: | Size: 471 KiB |
After Width: | Height: | Size: 392 KiB |
After Width: | Height: | Size: 448 KiB |
After Width: | Height: | Size: 353 KiB |
After Width: | Height: | Size: 355 KiB |
After Width: | Height: | Size: 375 KiB |
After Width: | Height: | Size: 629 KiB |
After Width: | Height: | Size: 597 KiB |
After Width: | Height: | Size: 519 KiB |
After Width: | Height: | Size: 588 KiB |
After Width: | Height: | Size: 368 KiB |
After Width: | Height: | Size: 349 KiB |
After Width: | Height: | Size: 260 KiB |
After Width: | Height: | Size: 263 KiB |
After Width: | Height: | Size: 412 KiB |
After Width: | Height: | Size: 367 KiB |
After Width: | Height: | Size: 374 KiB |
After Width: | Height: | Size: 259 KiB |
After Width: | Height: | Size: 340 KiB |
After Width: | Height: | Size: 314 KiB |
After Width: | Height: | Size: 380 KiB |
After Width: | Height: | Size: 329 KiB |
After Width: | Height: | Size: 331 KiB |
After Width: | Height: | Size: 245 KiB |
After Width: | Height: | Size: 275 KiB |
After Width: | Height: | Size: 279 KiB |
After Width: | Height: | Size: 265 KiB |
After Width: | Height: | Size: 281 KiB |
After Width: | Height: | Size: 224 KiB |
After Width: | Height: | Size: 229 KiB |
After Width: | Height: | Size: 226 KiB |
After Width: | Height: | Size: 240 KiB |
After Width: | Height: | Size: 244 KiB |
After Width: | Height: | Size: 366 KiB |