Cara Menyimpan Hasil Deteksi Objek ke File CSV
Model deteksi objek sudah jalan, kotak pembatas muncul di layar, tapi begitu program ditutup semua hasilnya hilang. Cara menyimpan hasil deteksi objek ke file CSV menyelesaikan masalah itu: setiap kotak, label, dan skor keyakinan ditulis ke baris tabel yang bisa dibuka di Excel atau dibaca lagi dengan Python. Panduan ini memakai pendekatan yang sama untuk model apa pun, baik YOLO, SSD, maupun model buatan sendiri.
Siapkan Struktur Data Sebelum Menulis Kode
Tentukan dulu kolom apa yang mau dicatat, baru sesuaikan program. Struktur minimal yang berguna untuk analisis lanjutan kira-kira seperti ini:
- timestamp — waktu deteksi terjadi, format ISO atau detik sejak program mulai.
- frame_id — nomor urut frame, berguna saat melacak objek yang sama di banyak frame.
- label — nama kelas, misalnya person, car, atau botol.
- confidence — skor keyakinan model, biasanya 0 sampai 1.
- x_min, y_min, x_max, y_max — koordinat kotak pembatas dalam piksel.
- source_file — nama video atau gambar asal, penting kalau memproses banyak berkas sekaligus.
Kalau nanti butuh lebar dan tinggi kotak, hitung saja saat membaca CSV: lebar = x_max - x_min. Menyimpan koordinat mentah lebih fleksibel karena masih bisa dihitung ulang dengan mudah.
Menulis Hasil Deteksi dengan Modul csv Python
Python sudah punya modul csv di pustaka standar, jadi tidak perlu instal apa pun. Pola yang dipakai: buka file sekali, tulis header sekali, lalu tambahkan baris setiap kali ada deteksi. Contoh kerangka di bawah memakai struktur hasil yang umum dari model deteksi (kotak, skor, kelas) dan menyesuaikannya sendiri dengan keluaran modelmu.
import csv
import time
from pathlib import Path
def buka_penulis_csv(path):
file_baru = not Path(path).exists()
f = open(path, "a", newline="", encoding="utf-8")
writer = csv.writer(f)
if file_baru:
writer.writerow([
"timestamp", "frame_id", "label", "confidence",
"x_min", "y_min", "x_max", "y_max", "source_file"
])
return f, writer
f, writer = buka_penulis_csv("deteksi.csv")
for frame_id, hasil in enumerate(aliran_frame):
for obj in hasil:
writer.writerow([
round(time.time(), 3),
frame_id,
obj["label"],
round(float(obj["confidence"]), 3),
int(obj["x1"]), int(obj["y1"]),
int(obj["x2"]), int(obj["y2"]),
"video_lapangan.mp4",
])
f.close()
Perhatikan dua hal kecil yang sering luput. Pertama, buka file dengan mode "a" (append) supaya hasil dari sesi sebelumnya tidak tertimpa. Kedua, tambahkan newline="" saat membuka file; tanpa itu, di Windows akan muncul baris kosong di antara data.
Kalau deteksi berjalan per frame dari kamera, jangan tutup file setiap frame. Biarkan terbuka selama proses berjalan, lalu tutup di blok finally atau saat program selesai. Membuka dan menutup file ratusan kali per detik membuat proses jauh lebih lambat daripada inferensinya sendiri.
Menyimpan Metadata Sesi di File Terpisah
Satu CSV berisi deteksi saja belum cukup untuk mengulang eksperimen. Simpan juga keterangan sesi: versi model, ambang keyakinan yang dipakai, resolusi input, dan nama berkas bobot. Tulis ke file kecil berformat JSON di folder yang sama.
import json
metadata = {
"model_file": "yolov8n.pt",
"confidence_threshold": 0.4,
"input_size": [640, 640],
"sumber": "video_lapangan.mp4",
}
with open("sesi.json", "w", encoding="utf-8") as f:
json.dump(metadata, f, indent=2)
Tanpa catatan ini, tiga bulan kemudian kamu akan menemukan file CSV dan bingung sendiri ambang keyakinan berapa yang dipakai waktu itu. Kalau butuh gambaran lebih lengkap soal menyiapkan bahan uji sebelum mencatat hasil, lihat panduan uji model computer vision sebelum dipakai agar data yang masuk ke CSV memang layak dianalisis.
Menjaga Ukuran File Tetap Wajar
Video 30 fps selama 10 menit berarti 18.000 frame. Kalau setiap frame ada lima objek, file CSV bisa berisi 90.000 baris. Masih terbaca, tapi kurang nyaman. Beberapa cara meringkasnya:
- Simpan hanya deteksi dengan keyakinan di atas ambang tertentu, misalnya 0.5, agar kotak asal-asalan tidak masuk.
- Catat satu baris per objek per beberapa frame, bukan setiap frame. Untuk menghitung jumlah orang di ruangan, sampel tiap 0,5 detik sudah cukup.
- Pisahkan file per sesi atau per video, lalu gabungkan belakangan dengan pandas kalau perlu.
- Simpan koordinat sebagai bilangan bulat, bukan desimal panjang. Selisih presisinya tidak terasa untuk analisis hitungan.
Kalau proyekmu melibatkan kamera yang dipasang di perangkat kecil, urusan kabel dan daya sering lebih merepotkan daripada pencatatan datanya. Panduan menghubungkan kamera ke Raspberry Pi membahas hal itu, termasuk cara memastikan kamera tidak terputus di tengah perekaman. Untuk proyek yang rangkaiannya berdekatan dengan kamera dan board, tips merapikan kabel proyek Arduino juga berguna agar kabel tidak tertarik saat perangkat dipindah.
Membaca Kembali CSV untuk Diperiksa
Langkah terakhir yang sering dilewat: buka lagi file yang baru dibuat dan pastikan isinya masuk akal. Dengan pandas, pemeriksaan dasar bisa dilakukan dalam beberapa baris.
import pandas as pd
df = pd.read_csv("deteksi.csv")
print(df["label"].value_counts())
print(df["confidence"].describe())
print(df.isna().sum())
Yang perlu dicurigai: kolom label kosong, confidence bernilai 0 atau 1 persis (biasanya tanda ada yang salah saat konversi), dan jumlah baris yang jauh lebih sedikit dari perkiraan. Setelah CSV bersih, kamu bisa membuat grafik jumlah objek per menit atau memetakan posisi kotak ke denah ruangan. Contoh pengolahan seperti itu ada di panduan visualisasi data hasil model computer vision.
Kalau data deteksi ini nantinya dipakai untuk laporan atau presentasi yang juga memuat rekaman suara narasi, siapkan berkas audionya dengan benar sejak awal. Panduan memilih format file audio untuk podcast menjelaskan perbedaan format yang memengaruhi ukuran dan kualitas rekaman.
Ringkasan Alur Kerja
Tentukan kolom, buka file CSV sekali dengan mode append, tulis header hanya saat file belum ada, lalu tambahkan baris setiap ada deteksi. Simpan metadata sesi di file JSON terpisah, batasi jumlah baris dengan ambang keyakinan, dan periksa hasilnya dengan pandas sebelum diolah lebih jauh. Dengan begitu, setiap kali model dijalankan kamu punya catatan yang bisa dibandingkan dengan sesi sebelumnya.
Pertanyaan yang Sering Diajukan
Lebih baik pakai CSV atau langsung ke database?
Untuk eksperimen dan analisis sekali jalan, CSV lebih praktis karena bisa dibuka di Excel maupun Python tanpa memasang server. Database baru masuk akal kalau beberapa proses menulis ke tabel yang sama secara bersamaan atau datanya sudah jutaan baris dan sering diquery.
Bagaimana kalau program berhenti mendadak di tengah perekaman?
Panggil f.flush() setiap beberapa ratus baris agar isi buffer benar-benar ditulis ke disk. Tanpa flush, baris terakhir bisa hilang saat proses dimatikan paksa. Menutup file lewat blok try/finally juga membantu memastikan file tidak tertinggal dalam keadaan setengah jadi.
Apakah koordinat kotak perlu disimpan dalam bentuk persen?
Simpan dalam piksel kalau semua video sumber punya resolusi sama, karena lebih mudah dibaca dan dihitung. Kalau resolusi berbeda-beda, bagi koordinat dengan lebar dan tinggi frame lalu simpan nilai 0 sampai 1 supaya perbandingan antar-video tetap adil.
