Cara Menyimpan Hasil Deteksi Objek ke JSON: Panduan Pemula

Kamu sudah menjalankan model deteksi objek dan hasilnya penuh kotak pembatas beserta label di layar. Begitu skrip ditutup, semua angka itu lenyap dan kamu harus menjalankan ulang model dari awal. Cara menyimpan hasil deteksi objek ke JSON menyelesaikan masalah ini: satu berkas teks berisi label, koordinat, dan skor kepercayaan yang bisa dibuka kapan saja tanpa GPU.

JSON cocok untuk pemula karena bentuknya mirip kamus Python. Kamu bisa membacanya dengan editor teks biasa, tidak butuh aplikasi tambahan seperti SQLite atau pandas. Kalau nanti datanya membesar dan perlu di-query, kamu bisa pindah ke database SQLite.

Apa Saja yang Perlu Disimpan dari Satu Deteksi

Hasil deteksi objek biasanya terdiri dari empat informasi per objek: nama kelas, kotak pembatas (x1, y1, x2, y2), skor kepercayaan, dan nama berkas gambar sumbernya. Tanpa nama berkas, kamu tidak akan tahu deteksi itu milik gambar yang mana saat membuka JSON berhari-hari kemudian.

Simpan juga metadata di level atas berkas: nama model, versi, ukuran gambar asli, dan waktu proses. Metadata ini berguna saat kamu membandingkan hasil dari dua model berbeda atau ingin mengulang evaluasi.

Kotak pembatas sebaiknya disimpan dalam koordinat piksel gambar asli, bukan koordinat piksel hasil resize. Kalau model menerima input 640x640 padahal gambar aslinya 1920x1080, konversi balik dulu supaya koordinat di JSON langsung bisa dipakai untuk menggambar kotak di gambar asli.

Menyusun Struktur JSON yang Rapi

Struktur datar lebih mudah diurai daripada bersarang terlalu dalam. Satu objek JSON berisi daftar gambar, dan tiap gambar berisi daftar deteksi. Bentuk seperti ini gampang dibaca manusia dan tetap mudah diolah skrip.

{
  "model": "yolov8n",
  "waktu_proses": "2026-11-12T09:30:00",
  "gambar": [
    {
      "nama": "jalan_01.jpg",
      "lebar": 1920,
      "tinggi": 1080,
      "deteksi": [
        {
          "kelas": "mobil",
          "skor": 0.87,
          "kotak": [412, 305, 780, 610]
        },
        {
          "kelas": "orang",
          "skor": 0.72,
          "kotak": [120, 290, 210, 640]
        }
      ]
    }
  ]
}

Kotak ditulis sebagai larik empat angka, bukan objek dengan kunci x1, y1, x2, y2. Larik menghemat ruang dan lebih cepat diurai. Urutannya harus konsisten: kiri atas lalu kanan bawah, dan tulis aturan itu di komentar dokumentasi proyekmu.

Menulis JSON dari Skrip Python

Modul json sudah ada di pustaka standar Python, jadi tidak perlu memasang apa pun. Kuncinya adalah mengubah hasil deteksi menjadi tipe data dasar Python: string, angka, list, dan dict. Objek seperti array NumPy atau tensor dari framework tidak bisa langsung diserialisasi.

import json

def simpan_hasil(daftar_gambar, path_keluaran):
    data = {
        "model": "yolov8n",
        "gambar": daftar_gambar,
    }
    with open(path_keluaran, "w", encoding="utf-8") as f:
        json.dump(data, f, indent=2, ensure_ascii=False)

# contoh satu gambar
hasil = [{
    "nama": "jalan_01.jpg",
    "lebar": 1920,
    "tinggi": 1080,
    "deteksi": [{
        "kelas": "mobil",
        "skor": float(0.87),
        "kotak": [int(v) for v in [412, 305, 780, 610]],
    }],
}]
simpan_hasil(hasil, "hasil_deteksi.json")

Argumen indent=2 membuat berkas mudah dibaca manusia. ensure_ascii=False menjaga karakter seperti tanda hubung atau huruf beraksen tetap utuh. Kalau kamu memproses ribuan gambar sekaligus, buang indent supaya ukuran berkas lebih kecil.

Gunakan float() dan int() saat membungkus nilai dari model. Kesalahan paling sering pemula adalah membiarkan tipe numpy.float32 lolos ke json.dump, yang berujung pesan TypeError: Object of type float32 is not JSON serializable.

Memilih antara Satu Berkas Besar atau Banyak Berkas Kecil

Dua pendekatan ini punya konsekuensi berbeda. Untuk eksperimen dengan puluhan gambar, satu berkas besar lebih praktis karena bisa langsung dibuka di editor. Untuk ribuan gambar, satu berkas bisa mencapai puluhan megabita dan sulit dimuat ulang.

  • Satu berkas: mudah dibagikan, cukup satu path, cocok untuk laporan hasil uji satu kali.
  • Banyak berkas: satu JSON per gambar, lebih mudah dilacak kalau proses terhenti di tengah jalan.
  • JSON Lines: satu baris JSON per gambar, cocok untuk aliran data berkelanjutan karena bisa ditambahkan tanpa membaca ulang seluruh berkas.

Kalau kamu memilih banyak berkas, beri nama mengikuti nama gambar asli, misalnya jalan_01.json. Saat butuh memeriksa satu foto, kamu tidak perlu menelusuri berkas gabungan.

Membaca Ulang JSON untuk Digambar atau Dianalisis

Memuat kembali JSON hanya butuh dua baris: buka berkas, lalu serahkan ke json.load. Setelah itu, tiap deteksi bisa dipakai untuk menggambar kotak di gambar asli, menghitung jumlah objek per kelas, atau menyusun tabel ringkasan.

with open("hasil_deteksi.json", encoding="utf-8") as f:
    data = json.load(f)

for gambar in data["gambar"]:
    print(gambar["nama"], len(gambar["deteksi"]), "objek")

Data ini juga bisa dijadikan bahan visualisasi. Membandingkan jumlah deteksi per kelas antar gambar lebih enak dilihat sebagai grafik batang, dan alat visualisasi ringan bisa membantunya. Pilihan aplikasinya bisa kamu lihat di daftar aplikasi visualisasi data AI gratis untuk pemula.

Jebakan yang Sering Ditemui

Beberapa kesalahan muncul berulang saat orang mulai menyimpan deteksi ke JSON. Mengetahui lebih awal menghemat waktu debugging.

  1. Lupa menyimpan nama gambar sehingga hasil tidak bisa dipasangkan kembali.
  2. Menyimpan koordinat hasil resize tanpa mencatat skala konversi.
  3. Membiarkan tipe data khusus framework lolos ke json.dump.
  4. Menimpa berkas keluaran setiap kali skrip dijalankan sehingga riwayat hilang.
  5. Menulis JSON tanpa encoding UTF-8, lalu label berbahasa Indonesia rusak saat dibuka di sistem lain.

Untuk jebakan nomor empat, tambahkan penanda waktu di nama berkas keluaran. Kamu jadi punya riwayat hasil dan bisa membandingkan performa model dari waktu ke waktu.

Kalau proyekmu melibatkan kamera yang membaca langsung, cek dulu kamera mana yang dipakai lewat perbandingan kamera USB dan kamera laptop untuk computer vision. Penyimpanan JSON tidak akan menolong kalau sumber gambar sudah tidak stabil.

Bagi yang memakai perangkat keras rakitan sendiri, misalnya kamera yang dipasang pada board mikrokontroler, urusan unggah data lewat kabel bisa jadi kendala tersendiri. Ada cara mengunggah program tanpa kabel USB seperti yang dibahas di panduan Arduino ISP untuk upload sketch tanpa USB, relevan kalau kamu membangun perangkat pengambil gambar yang portnya terbatas.

Menyimpan tangkapan layar sebagai bahan uji juga sering dilakukan pemula. Ada beberapa metode yang bisa dibandingkan di artikel perbandingan lima metode screenshot di laptop sebelum kamu memutuskan cara mengumpulkan gambar uji.

Ringkasan

Simpan label, kotak pembatas dalam koordinat piksel asli, skor, dan nama berkas gambar di setiap entri. Susun sebagai daftar gambar di dalam satu dokumen, tambahkan metadata model dan waktu proses, lalu tulis dengan json.dump memakai tipe data Python biasa. Pilih satu berkas besar untuk eksperimen kecil dan banyak berkas atau JSON Lines saat jumlah gambar bertambah.

Pertanyaan yang Sering Diajukan

Apakah JSON cukup untuk menyimpan hasil deteksi dalam jumlah besar?

Untuk ratusan hingga beberapa ribu gambar, JSON masih nyaman dipakai. Ketika kamu perlu menyaring hasil berdasarkan banyak kondisi sekaligus atau memperbarui sebagian data, database relasional seperti SQLite lebih sesuai.

Bagaimana cara menyimpan kotak pembatas agar tetap akurat?

Simpan dalam koordinat piksel gambar asli, bukan piksel hasil resize. Kalau model memakai input berukuran tetap, kalikan balik dengan rasio skala antara gambar asli dan input model, lalu bulatkan ke bilangan bulat.

Bolehkah menyimpan skor kepercayaan sebagai string?

Bisa, tapi tidak disarankan. Simpan sebagai angka desimal supaya kamu bisa menyaring deteksi dengan ambang batas tertentu tanpa perlu mengubah tipe data lebih dulu.