Mode belajar: tulis kode sendiri. Copy/cut, seleksi teks dan klik kanan dibatasi pada halaman; pembatasan UI bukan jaminan anti-penyalinan mutlak.
1. Tujuan
- Membedakan klasifikasi gambar dan deteksi objek melalui contoh bbox.
- Menafsirkan class, confidence dan koordinat bbox hasil model.
- Menghitung IoU dua bbox dan menjelaskan kegunaannya.
- Menjalankan inferensi minimal 10 gambar, menampilkan dan menyimpan hasil di runtime Colab.
Prasyarat: Python dasar, NumPy, pembacaan citra OpenCV, serta konversi BGR ke RGB.
2. Materi Pembahasan

2.1 Dari klasifikasi ke deteksi
Klasifikasi menjawab pertanyaan mengenai isi dominan sebuah gambar. Object detection menjawab pertanyaan yang lebih rinci: objek apa yang tampak, di mana lokasinya, dan berapa kandidat yang ditemukan. Satu citra dapat mengandung beberapa objek dari kelas berbeda maupun beberapa objek dari kelas yang sama. Setiap kandidat direpresentasikan oleh bounding box, yaitu persegi panjang yang membatasi lokasi objek, bukan batas bentuk objek yang persis.
YOLO merupakan keluarga model deteksi yang mempelajari pola visual dari dataset berlabel. Praktikum memakai bobot pretrained yolov8n.pt agar mahasiswa dapat mengeksplorasi inferensi sebelum membuat dataset sendiri. Ukuran nano dipilih sebagai baseline ringan yang tetap dapat dijalankan pada CPU. Pilihan ini bukan klaim model terbaru ataupun model terbaik untuk semua kebutuhan. Tujuan awal adalah membaca keluaran dengan benar.
2.2 Bounding box dan sistem koordinat
Koordinat xyxy berarti titik kiri atas x1,y1 dan kanan bawah x2,y2. Pada gambar digital, x bergerak ke kanan dan y bergerak ke bawah. Lebar kotak diperoleh dari x2 dikurangi x1; tinggi dari y2 dikurangi y1. Koordinat keluaran Results.boxes.xyxy merujuk ke citra asli, sehingga dapat dibandingkan dengan lebar dan tinggi gambar yang dibaca.
Representasi lain adalah xywh: pusat x, pusat y, lebar, dan tinggi. Jangan menukar representasi ini ketika menggambar atau menghitung luas. Koordinat ternormalisasi berada pada skala relatif terhadap dimensi gambar, sedangkan koordinat piksel menggunakan satuan piksel. Perbedaan ini menjadi penting pada anotasi dataset custom. Bbox sendiri dapat memuat latar belakang dan tidak dapat diperlakukan sebagai mask segmentasi.
2.3 Class, confidence, dan penyaringan
Class adalah indeks kategori pada model, sedangkan model.names menyediakan pemetaan indeks menjadi nama. Gunakan pemetaan tersebut alih-alih menebak bahwa angka tertentu selalu berarti objek tertentu. Model pretrained hanya memiliki kategori yang dipelajari saat training; semua jenis daun, kerusakan kendaraan, atau produk lokal tidak otomatis menjadi kategori yang tersedia. Kesamaan bentuk dengan kelas yang dikenal juga dapat menimbulkan salah prediksi.
Confidence adalah skor kandidat yang membantu penyaringan. Threshold lebih tinggi biasanya membuang lebih banyak deteksi, termasuk kandidat benar yang lemah. Threshold rendah dapat menampilkan objek sulit tetapi juga lebih banyak false positive. Skor tinggi tidak menjamin kebenaran, terutama ketika data input berbeda dari data pelatihan. Catat threshold saat membandingkan hasil agar perbandingan tidak berubah karena pengaturan yang tersembunyi.
2.4 IoU dan kotak yang saling bertumpuk
Intersection over Union membandingkan luas irisan dua bbox dengan luas gabungannya. Luas gabungan adalah luas kotak pertama ditambah luas kotak kedua dikurangi luas irisan. Nilai mendekati satu menandakan kesesuaian lokasi yang tinggi, sedangkan nol menunjukkan tidak ada irisan. Contoh hitung dalam notebook menggunakan kotak buatan untuk menjelaskan geometri, bukan mengklaim sebagai hasil model atau anotasi ground truth.
IoU digunakan dalam evaluasi dengan membandingkan prediksi dan anotasi, serta dalam penghapusan kandidat berlebih melalui non-maximum suppression pada baseline ini. Parameter iou saat predict adalah threshold NMS, bukan nilai akurasi yang langsung dihasilkan model. Confidence dan IoU menjawab pertanyaan berbeda: skor keyakinan kandidat versus kesesuaian lokasi. Menurunkan threshold NMS dapat menghapus bbox yang saling bertumpuk, termasuk objek berbeda yang berdekatan.
2.5 Alur inferensi yang dapat diperiksa
Alur praktik dimulai dengan instalasi paket, pemuatan bobot, upload gambar berizin, validasi input, predict, dan visualisasi. Ultralytics menerima array OpenCV dalam urutan BGR. Results.plot menghasilkan citra anotasi BGR; ubah ke RGB sebelum memakai Matplotlib. Menyimpan citra dengan cv2.imwrite tetap memakai BGR sehingga tidak perlu konversi untuk tahap penyimpanan tersebut.
Tidak ditemukannya objek adalah keluaran yang sah, bukan alasan membuat kotak atau confidence palsu. Periksa gambar asli, daftar kategori, kondisi pencahayaan, ukuran objek, serta threshold. Simpan hasil dan tabel parameter di direktori runtime, tetapi ingat runtime Colab bersifat sementara. Untuk tugas, gambar dan analisis harus terlihat pada output notebook yang dibagikan; tautan notebook adalah satu-satunya berkas pengumpulan.
Video pembelajaran sesuai bab
How YOLO Object Detection Works — DeepBean.
Fokus saat menonton: Amati ide deteksi sekali lintas, class dan bounding box. Video menjelaskan konsep YOLO; arsitektur YOLO generasi awal bukan rincian identik YOLOv8.
Referensi dan sumber ilustrasi
3. Praktikum Google Colab
Buat notebook baru, simpan pada Drive milik sendiri, lalu isi identitas. Gunakan sel kode terpisah untuk setiap langkah dan jalankan berurutan dengan Shift + Enter. Tidak perlu mengunduh notebook contoh atau memasang Python lokal.
# Materi 10 — Pengolahan Citra
Nama: [Nama lengkap mahasiswa]
NPM: [NPM mahasiswa]
Kelas: [Kelas, jika diperlukan]- Buat notebook Colab dengan Markdown Nama dan NPM paling atas, lalu ketik sel secara berurutan.
- Upload gambar berizin dengan variasi jumlah objek dan kondisi visual; jangan gunakan data pribadi tanpa persetujuan.
- Jalankan baseline, periksa seluruh visualisasi serta file ringkasan.csv dan citra anotasi di /content/hasil_yolo.
- Ulangi eksperimen pada beberapa gambar dengan confidence berbeda; jelaskan kandidat yang hilang atau bertambah.
- Jalankan perhitungan IoU dan kaitkan interpretasinya dengan ilustrasi bbox.
- Simpan notebook beserta output, atur akses Viewer, dan periksa tautan dari sesi lain.
Sel 1 — Instalasi Ultralytics
Jalankan sebagai sel tersendiri di Colab; tidak perlu meng-upgrade NumPy. Catat versi paket di sel berikutnya.
%pip install -q ultralyticsSel 2 — Model baseline dan direktori keluaran
Bobot yolov8n.pt diunduh saat pemuatan pertama. Ini baseline ringan, bukan pernyataan bahwa model ini yang terbaru. CPU dapat digunakan.
from pathlib import Path
import cv2, numpy as np, matplotlib.pyplot as plt
import torch, ultralytics
from ultralytics import YOLO
from google.colab import files
OUTPUT = Path('/content/hasil_yolo')
OUTPUT.mkdir(parents=True, exist_ok=True)
DEVICE = 0 if torch.cuda.is_available() else 'cpu'
model = YOLO('yolov8n.pt')
print('Ultralytics:', ultralytics.__version__, 'Device:', DEVICE)
print('Kelas model:', model.names)Sel 3 — Upload dan validasi gambar
Pilih satu atau lebih gambar berizin. Batas contoh: 20 gambar, maksimum 20 MB per gambar dan 20 megapiksel. Upload notebook memakai memori; jangan unggah berkas raksasa.
uploaded = files.upload()
if not uploaded or len(uploaded) > 20:
raise ValueError('Upload 1–20 gambar.')
images = []
for index, (name, content) in enumerate(uploaded.items()):
if Path(name).suffix.lower() not in {'.jpg', '.jpeg', '.png'}:
raise ValueError(f'Format tidak didukung: {name}')
if not (0 < len(content) <= 20 * 1024**2):
raise ValueError(f'Ukuran tidak valid: {name}')
image = cv2.imdecode(np.frombuffer(content, np.uint8), cv2.IMREAD_COLOR)
if image is None or image.shape[0] * image.shape[1] > 20_000_000:
raise ValueError(f'Gambar gagal dibaca atau terlalu besar: {name}')
images.append((f'{index:02}_{Path(name).stem}', image))
print('Gambar valid:', len(images))Sel 4 — Inferensi, tampilkan, dan simpan semua gambar
Jalankan setelah upload. Tiap gambar mendapat output anotasi dan ringkasan jumlah deteksi; tugas memerlukan minimal 10 gambar.
summary = []
for name, image in images:
result = model.predict(image, conf=0.25, iou=0.7, imgsz=640,
device=DEVICE, verbose=False)[0]
annotated = result.plot()
target = OUTPUT / f'{name}_deteksi.jpg'
if not cv2.imwrite(str(target), annotated):
raise IOError(f'Gagal menyimpan {target}')
summary.append({'gambar': name, 'jumlah_deteksi': len(result.boxes),
'conf_threshold': 0.25, 'hasil': str(target)})
plt.figure(figsize=(10, 7))
plt.imshow(cv2.cvtColor(annotated, cv2.COLOR_BGR2RGB))
plt.title(f'{name}: {len(result.boxes)} deteksi')
plt.axis('off'); plt.show()
import pandas as pd
from IPython.display import display
display(pd.DataFrame(summary))
pd.DataFrame(summary).to_csv(OUTPUT / 'ringkasan.csv', index=False)Sel 5 — Menghitung IoU dua kotak ilustratif
Angka di sini adalah koordinat buatan untuk latihan geometri, bukan keluaran inferensi.
def box_iou(a, b):
for box in (a, b):
if len(box) != 4 or box[2] <= box[0] or box[3] <= box[1]:
raise ValueError('Kotak harus xyxy dengan luas positif.')
iw = max(0, min(a[2], b[2]) - max(a[0], b[0]))
ih = max(0, min(a[3], b[3]) - max(a[1], b[1]))
intersection = iw * ih
area_a = (a[2] - a[0]) * (a[3] - a[1])
area_b = (b[2] - b[0]) * (b[3] - b[1])
return intersection / (area_a + area_b - intersection)
a = [10, 10, 110, 110]
b = [60, 60, 160, 160]
print('IoU kotak ilustratif:', box_iou(a, b))
assert box_iou(a, a) == 1
assert box_iou(a, [200, 200, 210, 210]) == 0Jika terjadi error
- Bobot gagal diunduh.
- Periksa koneksi runtime dan ulangi pemuatan yolov8n.pt; jangan mengganti hasil dengan data buatan.
- Warna hasil salah.
- Konversikan hasil plot BGR ke RGB sebelum Matplotlib, bukan sebelum cv2.imwrite.
- Gambar tidak memiliki deteksi.
- Periksa kelas model dan threshold; laporkan hasil nol apa adanya.
Runtime Colab dan file upload bersifat sementara. Simpan output penting pada notebook/Drive sebelum sesi berakhir. Jika runtime direset, jalankan ulang sel dari awal. Gunakan media berizin dan hindari unggahan data sensitif tanpa izin.
4. Tugas 10
Jalankan YOLO pada minimal 10 gambar berbeda, tampilkan semua hasil, dan simpan citra anotasi di runtime notebook.
Ketentuan pengerjaan
- Gunakan baseline yolov8n.pt dan catat versi paket serta device.
- Minimal 10 gambar berizin; jelaskan sumber atau izin tiap kelompok gambar.
- Tampilkan semua gambar hasil dan tabel jumlah deteksi serta threshold.
- Simpan citra anotasi dan ringkasan.csv; tampilkan lokasi file di notebook tanpa meminta upload file terpisah.
- Bahas minimal dua salah deteksi atau kegagalan; jika tidak ditemukan, uji kondisi lebih sulit dan laporkan observasi jujur.
- Kumpulkan hanya SATU link Google Colab dengan output dan analisis terlihat, akses Viewer; Nama dan NPM pada Markdown teratas.
Pertanyaan analisis
- Apa beda class, confidence, dan IoU?
- Bagaimana threshold memengaruhi objek kecil atau tertutup?
- Mengapa kategori di luar model.names tidak dapat diasumsikan dikenali?
# Materi 10 — Pengolahan Citra
Nama: [Nama lengkap mahasiswa]
NPM: [NPM mahasiswa]
Kelas: [Kelas, jika diperlukan]Pengumpulan
Kumpulkan satu link Google Colab saja. Nama dan NPM wajib berada pada sel Markdown paling atas. Sertakan kode, output yang tersimpan/terlihat serta analisis di notebook; tidak perlu mengumpulkan file .ipynb, ZIP, PDF atau screenshot terpisah.
- Jalankan sel dengan konfigurasi valid dan simpan notebook beserta output. Pastikan opsi menghilangkan output saat menyimpan tidak aktif untuk versi pengumpulan.
- Bagikan sebagai Viewer/Pelihat kepada dosen. Gunakan akses link jika diizinkan institusi; bila dibatasi, beri akses khusus akun dosen. Jangan memberi izin edit publik.
- Periksa akses dari akun penerima. Kirim URL notebook Colab, bukan folder Drive atau runtime sementara.
| Aspek | Bobot | Indikator |
|---|---|---|
| Cakupan dan validitas input | 25% | Minimal 10 gambar berizin dan tervalidasi. |
| Inferensi dan keluaran | 35% | Sel runnable, semua anotasi tampil dan hasil tersimpan. |
| Interpretasi | 30% | Membaca bbox/class/confidence dan membahas kegagalan secara tepat. |
| Reproduksibilitas notebook | 10% | Versi, parameter, identitas dan link Viewer lengkap. |