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