Pengolahan Citra · Materi 09

Pengenalan Artificial Intelligence untuk Computer Vision

Memahami ML, DL, dan CNN lewat klasifikasi minimal sepuluh gambar menggunakan MobileNetV3 Small pretrained dan membaca top-3 skor secara kritis.

Google Colab · OpenCV · Pemahaman konsep → pengamatan → praktikum → analisis

Mode belajar: tulis kode sendiri. Copy/cut, seleksi teks dan klik kanan dibatasi pada halaman; pembatasan UI bukan jaminan anti-penyalinan mutlak.

1. Tujuan

  1. Membedakan machine learning, deep learning, dan CNN secara konseptual tanpa matematika rumit.
  2. Membedakan klasifikasi satu gambar dengan deteksi objek berkotak.
  3. Menjalankan MobileNetV3 Small dengan bobot pretrained, transforms resmi, eval(), dan no_grad().
  4. Mengevaluasi top-3 prediksi pada minimal sepuluh gambar serta menjelaskan kelas tak tersedia, bias, dan skor yang bukan kepastian.

Prasyarat: Memahami citra RGB, unggah gambar, list/dictionary Python, dan cara menampilkan output notebook.

2. Materi Pembahasan

Inferensi aktual ImageNet; skor relatif kelas model, bukan kepastian jenis objek.
Inferensi aktual ImageNet; skor relatif kelas model, bukan kepastian jenis objek.

2.1 Dari aturan manual menuju pembelajaran dari contoh

Artificial intelligence atau AI adalah istilah luas untuk sistem yang menjalankan tugas yang kita hubungkan dengan kemampuan cerdas. Dalam pengolahan citra, salah satu jalurnya adalah machine learning: pola keputusan dipelajari dari contoh, bukan seluruhnya ditulis sebagai aturan tetap. Aturan warna hijau pada modul sebelumnya mudah dipahami, tetapi dapat gagal ketika cahaya berubah. Model pembelajaran mencoba menggunakan pola yang dipelajari untuk menghadapi variasi, namun tetap dapat gagal pada kondisi yang tidak tercakup data.

Deep learning adalah bagian machine learning yang menggunakan jaringan dengan banyak tahap pengolahan. CNN merupakan keluarga jaringan yang memanfaatkan operasi lokal pada citra. Secara intuitif, tahap awal dapat merespons pola sederhana, sedangkan tahap berikutnya menggabungkan informasi menjadi representasi yang membantu keputusan. Penjelasan ini adalah gambaran konseptual, bukan jaminan setiap neuron memiliki makna yang mudah diterjemahkan. Praktikum berfokus pada alur inferensi, bukan turunan matematika atau pelatihan dari nol.

2.2 Klasifikasi gambar berbeda dari deteksi objek

Klasifikasi memberi skor kategori untuk gambar sebagai satu masukan. Deteksi memberi kategori disertai lokasi objek, sehingga memungkinkan beberapa kotak dalam satu gambar. Segmentasi memerlukan keluaran yang lebih rinci pada tingkat piksel. Kita memilih klasifikasi agar perbedaan tugas terlihat jelas: tidak ada kotak objek yang dihasilkan MobileNet pada contoh ini. Menampilkan foto dengan tulisan kelas tidak mengubah classifier menjadi detector.

Gambar yang berisi banyak objek membuat evaluasi klasifikasi lebih sulit. Model bisa merespons objek besar, latar, atau konteks yang tidak menjadi fokus mahasiswa. Pilih foto dengan satu objek utama yang jelas untuk kelompok awal, lalu tambahkan gambar ambigu sebagai uji keterbatasan. Tetapkan objek yang ingin dinilai sebelum melihat prediksi. Jangan menyebut perbedaan label sebagai kesalahan pasti apabila label pengamatan sendiri masih ambigu atau terlalu rinci dibanding kosakata model.

2.3 Bobot pretrained dan alur inferensi yang konsisten

Model pretrained sudah memiliki parameter hasil pelatihan sebelumnya. Mengunduh bobot bukan melatih model menggunakan foto kita. Praktikum memakai MobileNetV3 Small dengan enum IMAGENET1K_V1 dan label dari metadata bobot, sehingga urutan nama kelas sama dengan urutan skor. Ini baseline ringan untuk belajar, bukan klaim model paling baru atau paling akurat. Unduhan pertama memerlukan jaringan; setelah bobot tersedia, CPU cukup untuk sejumlah kecil gambar. API dan preprocessing model dijelaskan pada referensi torchvision resmi.

Masukan diubah menjadi RGB lalu diproses dengan weights.transforms(), bukan normalisasi yang dikira-kira. Transformasi resmi mengatur resize, crop, dan normalisasi sesuai bobot. Crop pusat dapat membuat objek di tepi terpotong, sehingga gambar masukan utuh tidak selalu sama dengan wilayah yang dilihat jaringan. model.eval() mengatur mode inferensi dan torch.no_grad() meniadakan pencatatan gradien. Keduanya diperlukan untuk alur contoh yang hemat dan konsisten, tetapi tidak menjadikan prediksi bebas kesalahan.

2.4 Top-3 skor, kelas tak tersedia, dan interpretasi

Model menghasilkan logits yang diubah dengan softmax menjadi skor relatif pada kosakata kelas. Kita menampilkan tiga skor terbesar agar pembaca melihat alternatif, bukan hanya satu nama. Skor menjumlah ke satu di seluruh kelas model, tetapi tidak otomatis terkalibrasi sebagai peluang benar pada foto pribadi. Hasil tinggi dapat muncul pada foto aneh atau kelas yang tidak tersedia. Gunakan kata skor model, bukan persentase kepastian atau kebenaran.

Kosakata model bersifat terbatas. Misalnya, foto daun spesies lokal tidak berarti model dapat memberi nama spesies atau mendiagnosis penyakit. Ketika kelas yang diinginkan tidak ada, tandai masukan DI_LUAR_KELAS sebelum melihat prediksi. Model tidak menyediakan penolakan unknown yang otomatis andal pada demo ini: ia tetap memberi peringkat kelas tersedia. TIDAK_PASTI digunakan bila penilai manusia belum dapat menetapkan kelas. Kedua kondisi dipisahkan dari evaluasi label yang memang tersedia.

2.5 Evaluasi kecil, bias, dan tanggung jawab pengguna

Sepuluh gambar adalah latihan observasi, bukan benchmark umum. Hitungan top-1 dan top-3 pada kelas tersedia membantu merangkum percobaan, tetapi sangat dipengaruhi pemilihan gambar dan kualitas label manusia. Tidak ada pelatihan atau penyetelan model pada kumpulan ini, sehingga jangan menyebutnya dataset training. Foto duplikat dengan crop berbeda bukan sepuluh objek independen. Gunakan variasi objek dan kondisi, serta jelaskan jumlah gambar yang dikeluarkan dari perhitungan karena unknown atau ambigu.

Bias dapat muncul bila pola data pelatihan berbeda dari penggunaan, misalnya latar, sudut pandang, dan kategori yang jarang terwakili. Beberapa keberhasilan tidak membuktikan kinerja setara pada semua konteks. Prediksi yang tampak masuk akal tetapi tidak didukung gambar harus dicatat sebagai kesalahan, bukan dibuatkan alasan palsu. Hindari gambar sensitif, gunakan izin yang jelas, dan jangan membuat keputusan medis, keselamatan, atau identitas berdasarkan praktikum ini. Sajikan output aktual beserta analisis yang dapat diperiksa.

Video pembelajaran sesuai bab

But what is a neural network? | Deep learning chapter 1 — 3Blue1Brown.

Fokus saat menonton: Amati neuron, bobot, aktivasi dan pembelajaran. Hubungkan dengan CNN/pretrained di bab ini; video menjelaskan dasar jaringan, bukan API MobileNet.

Buka video di YouTube jika pemutar tidak tersedia

Video referensi berbahasa Inggris. Bila ada setup lokal, API atau versi model berbeda, pelajari konsepnya dan tetap gunakan alur Google Colab pada praktikum bab ini. Ketersediaan pemutar mengikuti YouTube, pemilik video dan jaringan.

Referensi dan sumber ilustrasi

Foto daun: Ανώνυμος Βικιπαιδιστής, Wikimedia Commons, CC BY 3.0; diubah ukuran/intensitas untuk ilustrasi. Foto bus: contoh aset Ultralytics. Foto astronaut: NASA melalui scikit-image. Panel diagram/simulasi ditandai pada caption; bukan hasil eksperimen yang dikarang. Hak penggunaan sumber tetap mengikuti sumber asli.

3. Praktikum Google Colab

Buka 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.

Identitas di bagian paling atas notebook: tambahkan sel Text/Markdown sebelum kode dan isi Nama serta NPM.
# Materi 09 — Pengolahan Citra
Nama: [Nama lengkap mahasiswa]
NPM: [NPM mahasiswa]
Kelas: [Kelas, jika diperlukan]
  1. Buat notebook dengan Nama/NPM, lalu jalankan import dan muat model; hanya gunakan setup opsional jika paket belum tersedia.
  2. Siapkan 10–20 gambar berizin dengan satu objek utama; paling sedikit lima gambar memiliki kategori yang tersedia.
  3. Unggah dan periksa semua gambar, kemudian cari kategori pada classes dan tentukan label pengamatan sebelum inferensi.
  4. Jalankan inferensi dan tampilkan setiap masukan dengan top-3 nama kategori serta skor.
  5. Jalankan ringkasan hitungan; pisahkan gambar kelas tersedia, di luar kelas, dan label pengamatan ambigu.
  6. Tulis analisis minimal dua kesalahan/ketidakcocokan atau kondisi sulit yang benar-benar terlihat; jika semua benar, tambah masukan menantang tanpa mengubah label setelah melihat prediksi.
  7. Bagikan satu link Colab Viewer dengan output dan analisis, tanpa berkas tambahan.

Sel 1 — 1. Import

Runtime Colab standar umumnya menyediakan PyTorch/torchvision. Bila import tidak tersedia, jalankan sel setup opsional lalu restart runtime bila diminta.

import io, math, warnings
import torch, torchvision
import matplotlib.pyplot as plt
from PIL import Image, ImageOps
from google.colab import files
from torchvision.models import mobilenet_v3_small, MobileNet_V3_Small_Weights
print('torch:', torch.__version__, '| torchvision:', torchvision.__version__)

Sel 2 — 2. Muat bobot dan label resmi

Unduhan pertama perlu jaringan. CPU menjadi pilihan eksplisit untuk demo kecil; bobot tidak dilatih ulang.

device = torch.device('cpu')
weights = MobileNet_V3_Small_Weights.IMAGENET1K_V1
preprocess = weights.transforms()
model = mobilenet_v3_small(weights=weights).to(device)
model.eval()
classes = weights.meta['categories']
class_lookup = {label.casefold(): label for label in classes}
print('Jumlah kategori model:', len(classes))
print('Contoh pencarian label mengandung cat:', [x for x in classes if 'cat' in x.lower()][:20])
print('Untuk mencari kelas lain: [x for x in classes if "bus" in x.lower()]')
print(preprocess)

Sel 3 — 3. Unggah minimal sepuluh gambar

Pilih 10–20 JPG/PNG berbeda, masing-masing maksimal 5 MB, total maksimal 50 MB, sisi maksimal 4096 piksel. Masukan yang ditolak dicetak; minimal 10 gambar valid wajib tersedia.

uploaded = files.upload()
if not 10 <= len(uploaded) <= 20:
    raise ValueError('Unggah 10 sampai 20 gambar, bukan ZIP.')
if sum(len(raw) for raw in uploaded.values()) > 50 * 1024 * 1024:
    raise ValueError('Total unggahan maksimal 50 MB.')
images = []
for nama, raw in uploaded.items():
    try:
        if not nama.lower().endswith(('.jpg', '.jpeg', '.png')) or len(raw) > 5 * 1024 * 1024:
            raise ValueError('Format/ukuran berkas melampaui batas.')
        with warnings.catch_warnings():
            warnings.simplefilter('error', Image.DecompressionBombWarning)
            with Image.open(io.BytesIO(raw)) as source:
                if max(source.size) > 4096:
                    raise ValueError('Sisi gambar maksimal 4096 piksel.')
                if source.format not in ('JPEG', 'PNG'):
                    raise ValueError('Isi berkas bukan JPEG/PNG.')
                pil = ImageOps.exif_transpose(source).convert('RGB')
                pil.load()
        images.append({'name': nama, 'image': pil})
    except Exception as exc:
        print('Ditolak:', nama, '|', str(exc))
if len(images) < 10:
    raise ValueError('Gambar valid kurang dari 10; unggah ulang kumpulan yang sesuai.')
print('Gambar valid:', len(images))
for item in images:
    plt.figure(figsize=(4, 3))
    plt.imshow(item['image']); plt.title(item['name']); plt.axis('off'); plt.show()

Sel 4 — 4. Tetapkan label pengamatan sebelum inferensi

Ketik nama kategori persis dari classes. Gunakan DI_LUAR_KELAS untuk objek yang kelasnya tidak tersedia, atau TIDAK_PASTI jika ambigu. Minimal lima gambar harus dapat diberi label kelas tersedia.

special = {'DI_LUAR_KELAS', 'TIDAK_PASTI'}
for item in images:
    while True:
        answer = input(f"Label pengamatan untuk {item['name']}: ").strip()
        if answer.upper() in special:
            item['expected'] = answer.upper()
            break
        if answer.casefold() in class_lookup:
            item['expected'] = class_lookup[answer.casefold()]
            break
        print('Label tidak ada dalam kosakata. Cari di classes atau gunakan penanda khusus.')
known_count = sum(item['expected'] not in special for item in images)
if known_count < 5:
    raise ValueError('Sertakan minimal lima gambar dengan kelas tersedia; jalankan ulang upload dan label.')
print('Label kelas tersedia:', known_count)

Sel 5 — 5. Inferensi top-3 dan visualisasi

Gambar diproses satu per satu agar ringan. Skor softmax adalah keluaran model, bukan kepastian bahwa label benar.

results = []
with torch.no_grad():
    for item in images:
        tensor = preprocess(item['image']).unsqueeze(0).to(device)
        logits = model(tensor)[0]
        probs = torch.softmax(logits, dim=0)
        scores, indices = torch.topk(probs, k=3)
        top3 = [(classes[int(index)], float(score))
                for index, score in zip(indices.cpu(), scores.cpu())]
        results.append({'name': item['name'], 'expected': item['expected'], 'top3': top3})
for item, result in zip(images, results):
    plt.figure(figsize=(6, 4))
    plt.imshow(item['image']); plt.axis('off')
    lines = [f"{label}: skor {score:.3f}" for label, score in result['top3']]
    plt.title(item['name'] + chr(10) + chr(10).join(lines))
    plt.show()
    print('Pengamatan sebelum inferensi:', result['expected'])

Sel 6 — 6. Ringkasan evaluasi kecil

Hanya gambar dengan label tersedia masuk hitungan kesesuaian. Penanda khusus tetap dilaporkan dan tidak disamakan dengan label classifier.

known_results = [r for r in results if r['expected'] not in special]
hits_top1 = sum(r['top3'][0][0] == r['expected'] for r in known_results)
hits_top3 = sum(r['expected'] in [label for label, score in r['top3']] for r in known_results)
print('Total inferensi:', len(results))
print('Dengan kelas tersedia:', len(known_results))
print('DI_LUAR_KELAS:', sum(r['expected'] == 'DI_LUAR_KELAS' for r in results))
print('TIDAK_PASTI:', sum(r['expected'] == 'TIDAK_PASTI' for r in results))
if known_results:
    print(f'Kesesuaian top-1: {hits_top1}/{len(known_results)} ({hits_top1/len(known_results):.1%})')
    print(f'Kesesuaian top-3: {hits_top3}/{len(known_results)} ({hits_top3/len(known_results):.1%})')
print('Ringkasan ini hanya berlaku untuk sampel praktik, bukan akurasi umum model.')
for r in results:
    print(r['name'], '| pengamatan:', r['expected'], '| top-3:', r['top3'])

Sel 7 — Setup opsional jika paket belum tersedia

Jalankan hanya jika sel import menghasilkan ModuleNotFoundError. Tidak perlu menjalankan pada Colab yang sudah memiliki pasangan torch/torchvision kompatibel. Setelah instalasi, restart runtime jika paket sudah diimport dan jalankan sel 1 kembali.

%pip install torch torchvision

Jika terjadi error

Unduhan bobot gagal.
Periksa jaringan runtime dan ulangi pemuatan bobot. Jangan membuat hasil prediksi palsu atau memakai model tanpa bobot tanpa menjelaskan perubahan.
torchvision tidak cocok dengan torch atau import operator gagal.
Gunakan runtime Colab baru dengan pasangan paket bawaan kompatibel; jika paket tidak tersedia gunakan setup opsional untuk memasang pasangan bersama, kemudian restart.
Label pengamatan tidak ada di classes.
Cari kosakata resmi; bila objek memang tidak memiliki kategori, tandai DI_LUAR_KELAS. Jangan menambahkan nama kategori seolah keluaran model.
Skor tinggi tetapi gambar tampak tidak cocok.
Catat sebagai kegagalan/unknown, periksa crop dan konteks gambar, serta jelaskan skor relatif bukan kepastian.
Jumlah gambar valid kurang dari sepuluh.
Periksa pesan penolakan, ganti berkas bermasalah, dan unggah ulang 10–20 gambar yang memenuhi batas.

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 9

Gunakan model pretrained MobileNetV3 Small untuk mengklasifikasikan minimal sepuluh gambar dan menganalisis top-3 skor. Kumpulkan hanya satu link Google Colab dengan output serta analisis terlihat dan akses Viewer.

Ketentuan pengerjaan

  1. Nama/NPM pada sel Markdown teratas.
  2. Gunakan 10–20 gambar berbeda dan berizin, bukan sepuluh salinan/crop dari satu objek yang sama.
  3. Pilih minimal lima gambar dengan kategori tersedia dan sertakan minimal satu masukan sulit, ambigu, atau di luar kelas.
  4. Gunakan bobot IMAGENET1K_V1, transforms resmi, model.eval(), dan torch.no_grad(); tidak melatih ulang model.
  5. Tetapkan label pengamatan sebelum inferensi; tampilkan semua gambar dengan top-3 kategori dan skor aktual.
  6. Laporkan kesesuaian top-1/top-3 hanya pada label yang tersedia, serta jumlah DI_LUAR_KELAS dan TIDAK_PASTI.
  7. Analisis minimal dua kasus sulit; jangan menyatakan semua jenis daun dikenali, skor sebagai kepastian, atau sampel kecil sebagai akurasi umum.
  8. Tidak mengumpulkan model, gambar, CSV, PDF, ZIP, screenshot, atau .ipynb terpisah.

Pertanyaan analisis

  1. Apa perbedaan ML, DL, dan CNN, serta apa yang sebenarnya terjadi pada inferensi tanpa pelatihan?
  2. Mengapa model ini classifier, bukan detector, meskipun label ditampilkan bersama gambar?
  3. Bagaimana crop resmi dan latar dapat memengaruhi top-3 pada kasus sulit?
  4. Apa yang terjadi pada kategori di luar kosakata, dan mengapa skor tinggi tidak membuktikan prediksi benar?
  5. Apa keterbatasan sampel kecil dan kemungkinan bias yang perlu dicatat?
Identitas di bagian paling atas notebook: tambahkan sel Text/Markdown sebelum kode dan isi Nama serta NPM.
# Materi 09 — 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.

  1. Jalankan sel dengan konfigurasi valid dan simpan notebook beserta output. Pastikan opsi menghilangkan output saat menyimpan tidak aktif untuk versi pengumpulan.
  2. Bagikan sebagai Viewer/Pelihat kepada dosen. Gunakan akses link jika diizinkan institusi; bila dibatasi, beri akses khusus akun dosen. Jangan memberi izin edit publik.
  3. Periksa akses dari akun penerima. Kirim URL notebook Colab, bukan folder Drive atau runtime sementara.
AspekBobotIndikator
Inferensi dan preprocessing35%Bobot resmi, transforms, eval/no_grad, dan seluruh gambar valid diproses benar.
Keluaran eksperimen30%Minimal sepuluh gambar, top-3 skor, label awal, dan ringkasan kelompok terlihat.
Analisis kritis25%Dua kasus sulit, unknown, bias, serta perbedaan classification/detection dijelaskan berdasarkan keluaran.
Keterbacaan dan akses10%Identitas, urutan sel, analisis, izin gambar, dan satu link Viewer lengkap.