File size: 3,570 Bytes
fcf6ad5
 
 
 
3e8a5f8
979a90f
 
fcf6ad5
3e8a5f8
fcf6ad5
 
8f29306
fcf6ad5
979a90f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fcf6ad5
3e8a5f8
fcf6ad5
 
 
 
3e8a5f8
 
 
 
 
 
 
 
 
 
6b64c3f
2eddcfe
 
 
 
 
 
 
 
 
 
6b64c3f
979a90f
 
6b64c3f
3e8a5f8
 
6b64c3f
3e8a5f8
 
 
6b64c3f
fcf6ad5
 
3e8a5f8
8eaadb5
fcf6ad5
 
 
 
 
6b64c3f
fcf6ad5
 
 
6b64c3f
3e8a5f8
 
 
 
fcf6ad5
 
 
 
 
 
 
 
 
 
 
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
110
111
import gradio as gr
from roboflow import Roboflow
import tempfile
import os
from sahi.slicing import slice_image
import numpy as np
import cv2

# Inisialisasi Roboflow (for model path)
rf = Roboflow(api_key="Otg64Ra6wNOgDyjuhMYU")
project = rf.workspace("alat-pelindung-diri").project("nescafe-4base")
model = project.version(16).model

# Fungsi untuk melakukan Non-Maximum Suppression (NMS)
def apply_nms(predictions, iou_threshold=0.5):
    boxes = []
    scores = []
    classes = []

    # Extract boxes, scores, and class info
    for prediction in predictions:
        boxes.append(prediction['bbox'])
        scores.append(prediction['confidence'])
        classes.append(prediction['class'])

    boxes = np.array(boxes)
    scores = np.array(scores)
    classes = np.array(classes)

    # Perform NMS using OpenCV
    indices = cv2.dnn.NMSBoxes(boxes.tolist(), scores.tolist(), score_threshold=0.25, nms_threshold=iou_threshold)
    nms_predictions = []

    for i in indices.flatten():
        nms_predictions.append({
            'class': classes[i],
            'bbox': boxes[i],
            'confidence': scores[i]
        })

    return nms_predictions

# Fungsi untuk deteksi objek menggunakan Roboflow Model
def detect_objects(image):
    # Menyimpan gambar sementara
    with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as temp_file:
        image.save(temp_file, format="JPEG")
        temp_file_path = temp_file.name

    # Slice gambar menjadi potongan-potongan kecil
    slice_image_result = slice_image(
        image=temp_file_path,
        output_file_name="sliced_image",
        output_dir="/tmp/sliced/",
        slice_height=256,
        slice_width=256,
        overlap_height_ratio=0.1,
        overlap_width_ratio=0.1
    )

    # Mendapatkan path-potongan gambar
    sliced_image_paths = slice_image_result['sliced_image_paths']

    # Menyimpan semua prediksi untuk setiap potongan gambar
    all_predictions = []

    # Prediksi pada setiap potongan gambar
    for sliced_image_path in sliced_image_paths:
        predictions = model.predict(image_path=sliced_image_path).json()
        all_predictions.extend(predictions['predictions'])

    # Aplikasikan NMS untuk menghapus duplikat deteksi
    postprocessed_predictions = apply_nms(all_predictions, iou_threshold=0.5)

    # Annotate gambar dengan hasil prediksi
    annotated_image = model.annotate_image_with_predictions(temp_file_path, postprocessed_predictions)

    # Simpan gambar hasil annotasi
    output_image_path = "/tmp/prediction.jpg"
    annotated_image.save(output_image_path)

    # Menghitung jumlah objek per kelas
    class_count = {}
    for detection in postprocessed_predictions:
        class_name = detection['class']
        if class_name in class_count:
            class_count[class_name] += 1
        else:
            class_count[class_name] = 1

    # Hasil perhitungan objek
    result_text = "Jumlah objek per kelas:\n"
    for class_name, count in class_count.items():
        result_text += f"{class_name}: {count} objek\n"

    # Hapus file sementara
    os.remove(temp_file_path)

    return output_image_path, result_text

# Membuat antarmuka Gradio
iface = gr.Interface(
    fn=detect_objects,                         # Fungsi yang dipanggil saat gambar diupload
    inputs=gr.Image(type="pil"),               # Input berupa gambar
    outputs=[gr.Image(), gr.Textbox()],        # Output gambar dan teks
    live=True                                    # Menampilkan hasil secara langsung
)

# Menjalankan antarmuka
iface.launch()