Dokumentasi ini menjelaskan skrip otomatisasi yang digunakan untuk memfilter dataset agar hanya mengandung satu kelas spesifik, yaitu Api (Class 0). Skrip ini sangat krusial dalam tahap persiapan data jika ingin membandingkan performa model multi-class vs single-class pada tesis.
Program ini bekerja dengan cara melakukan iterasi pada folder anotasi YOLO (.txt) dan memodifikasi isinya secara destruktif untuk menyisakan label objek yang diinginkan.
0 (indeks standar untuk Api dalam dataset D-Fire).base_dir: Lokasi direktori utama dataset yang sudah dipisah menjadi folder train, valid, dan test.label_dirs: Daftar folder label yang akan diproses secara otomatis oleh sistem.valid_lines: List sementara untuk menampung koordinat objek api yang berhasil difilter sebelum ditulis ulang ke disk.Skrip mengikuti alur logika sebagai berikut:
train/valid/test)..txt.0 , baris tersebut disimpan.os.remove) untuk mencegah error pada training YOLO.PERHATIAN: Skrip ini bersifat destruktif (menghapus data secara permanen). Selalu buat cadangan (backup) folder dataset asli sebelum menjalankan skrip ini agar data label asli (asap) tidak hilang jika suatu saat dibutuhkan kembali.
import os
# --- KONFIGURASI (UBAH BAGIAN INI) ---
# Ganti dengan path ke folder utama dataset Anda yang sudah di-split
base_dir = 'C:/Users/Farhan/Documents/Projects/Tesis/proyek-tesis/rev_fire_detection/01_dataset/'
# ---------------------------------------------
# Folder-folder label yang akan dibersihkan
label_dirs = [
os.path.join(base_dir, 'train', 'labels'),
os.path.join(base_dir, 'valid', 'labels'),
os.path.join(base_dir, 'test', 'labels')
]
print("Memulai pembersihan label untuk fokus pada kelas '0' (Api)...")
files_processed = 0
files_deleted = 0
lines_removed = 0
for directory in label_dirs:
if not os.path.exists(directory):
print(f"Peringatan: Direktori tidak ditemukan: {directory}")
continue
print(f"\nMemproses direktori: {directory}")
for filename in os.listdir(directory):
if filename.endswith('.txt'):
filepath = os.path.join(directory, filename)
valid_lines = []
try:
with open(filepath, 'r') as f:
original_lines = f.readlines()
for line in original_lines:
# Hanya simpan baris yang dimulai dengan '0 ' (kelas api)
if line.strip().startswith('0 '):
valid_lines.append(line)
# Hitung berapa banyak baris yang dihapus
lines_removed += len(original_lines) - len(valid_lines)
# Jika masih ada baris valid (ada label api), tulis ulang filenya
if valid_lines:
with open(filepath, 'w') as f:
f.writelines(valid_lines)
# Jika tidak ada baris valid (file hanya berisi label asap), hapus filenya
else:
os.remove(filepath)
files_deleted += 1
# print(f"Menghapus {filename} karena hanya berisi label non-api.")
files_processed += 1
except Exception as e:
print(f"Error saat memproses file {filepath}: {e}")
print("\n--- PROSES SELESAI ---")
print(f"Total file label diproses: {files_processed}")
print(f"Total baris label non-api dihapus: {lines_removed}")
print(f"Total file label kosong dihapus: {files_deleted}")
print("Dataset Anda sekarang bersih dan hanya berisi anotasi untuk kelas 'Api'.")