first commit

This commit is contained in:
Harrisembuaba1234 2025-05-26 21:27:13 +07:00
commit 45d819a5ce
140 changed files with 4859 additions and 0 deletions

175
app.py Normal file
View File

@ -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)

31
cert.pem Normal file
View File

@ -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-----

52
key.pem Normal file
View File

@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
EPmju7tZZ4jK6tFhrXacBTGOFfdVbZw=
-----END PRIVATE KEY-----

Binary file not shown.

Binary file not shown.

Binary file not shown.

2689
model/tomato_classifier.xml Normal file

File diff suppressed because it is too large Load Diff

6
p.py Normal file
View File

@ -0,0 +1,6 @@
<hr class="my-4">
{% if error %}
<div class="alert alert-danger" role="alert">
{{ error }}
</div>
{% endif %}

BIN
static/image/Tomat_hijo.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1006 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

BIN
static/image/tomat1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
static/image/tomat2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
static/image/tomat3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
static/image/tomatBusuk.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
static/image/tomatFresh.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 907 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

BIN
static/image/tomato.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

1277
static/style.css Normal file

File diff suppressed because it is too large Load Diff

BIN
static/uploads/2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
static/uploads/222.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
static/uploads/3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
static/uploads/32wt5nv8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
static/uploads/8657.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
static/uploads/OIP.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
static/uploads/OIPP.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 414 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 471 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 629 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 597 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 588 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

Some files were not shown because too many files have changed in this diff Show More