File size: 4,128 Bytes
ac831c4 5a61493 b34cc48 5a61493 c66a6f5 426695e ac831c4 5a61493 ac831c4 7e0a954 ac831c4 5a61493 ac831c4 5a61493 c66a6f5 426695e c66a6f5 5a61493 c66a6f5 5a61493 c66a6f5 426695e 5a61493 7e0a954 ac831c4 5a61493 5f0c190 5a61493 ac831c4 7e0a954 5a61493 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
import gradio as gr
from dotenv import load_dotenv
from roboflow import Roboflow
import tempfile
import os
import requests
from sahi.predict import get_sliced_prediction # SAHI slicing inference
import supervision as sv # For annotating images with results
# Muat variabel lingkungan dari file .env
load_dotenv()
api_key = os.getenv("ROBOFLOW_API_KEY")
workspace = os.getenv("ROBOFLOW_WORKSPACE")
project_name = os.getenv("ROBOFLOW_PROJECT")
model_version = int(os.getenv("ROBOFLOW_MODEL_VERSION"))
# Inisialisasi Roboflow menggunakan data yang diambil dari secrets
rf = Roboflow(api_key=api_key)
project = rf.workspace(workspace).project(project_name)
model = project.version(model_version).model
# Fungsi untuk menangani input dan output gambar
def detect_objects(image):
# Simpan gambar yang diupload sebagai file sementara
with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as temp_file:
image.save(temp_file, format="JPEG")
temp_file_path = temp_file.name
try:
# Perform sliced inference with SAHI
result = get_sliced_prediction(
temp_file_path,
model,
slice_height=256, # Adjust slice height as needed
slice_width=256, # Adjust slice width as needed
overlap_height_ratio=0.2, # Adjust overlap height ratio as needed
overlap_width_ratio=0.2 # Adjust overlap width ratio as needed
)
# Menghitung jumlah objek per kelas
class_count = {}
total_count = 0 # Menyimpan total jumlah objek
for prediction in result.object_prediction_list:
class_name = prediction.class_id # or prediction.class_name if available
class_count[class_name] = class_count.get(class_name, 0) + 1
total_count += 1 # Tambah jumlah objek untuk setiap prediksi
# Menyusun output berupa string hasil perhitungan
result_text = "Product Nestle\n\n"
for class_name, count in class_count.items():
result_text += f"{class_name}: {count}\n"
result_text += f"\nTotal Product Nestle: {total_count}"
# Menyimpan gambar dengan prediksi
output_image_path = "/tmp/prediction.jpg"
result.export_visuals(export_dir="/tmp/") # Export visuals for display
output_image_path = "/tmp/prediction_visual.png" # Assuming the visual output is saved here
# Annotating the image with the detections (optional)
label_annotator = sv.LabelAnnotator()
box_annotator = sv.BoxAnnotator()
annotated_image = box_annotator.annotate(
scene=image.copy(), detections=result.object_prediction_list)
annotated_image = label_annotator.annotate(
scene=annotated_image, detections=result.object_prediction_list)
# Save the annotated image
annotated_image.save(output_image_path)
except requests.exceptions.HTTPError as http_err:
# Menangani kesalahan HTTP
result_text = f"HTTP error occurred: {http_err}"
output_image_path = temp_file_path # Kembalikan gambar asli jika terjadi error
except Exception as err:
# Menangani kesalahan lain
result_text = f"An error occurred: {err}"
output_image_path = temp_file_path # Kembalikan gambar asli jika terjadi error
# Hapus file sementara setelah prediksi
os.remove(temp_file_path)
return output_image_path, result_text
# Membuat antarmuka Gradio dengan tata letak fleksibel
with gr.Blocks() as iface:
with gr.Row():
with gr.Column():
input_image = gr.Image(type="pil", label="Input Image")
with gr.Column():
output_image = gr.Image(label="Detect Object")
with gr.Column():
output_text = gr.Textbox(label="Counting Object")
# Tombol untuk memproses input
detect_button = gr.Button("Detect")
# Hubungkan tombol dengan fungsi deteksi
detect_button.click(
fn=detect_objects,
inputs=input_image,
outputs=[output_image, output_text]
)
# Menjalankan antarmuka
iface.launch()
|