Chapter sebelumnya telah membahas cara membangun CNN, mengatur training loop, dan membaca metrik evaluasi. Proyek ini merangkainya menjadi satu alur kerja deteksi penyakit tanaman: mengumpulkan data, memproses gambar, melatih model, mengevaluasi prediksi, lalu membedah kesalahan model satu per satu. Targetnya konkret — program yang memisahkan gambar daun sehat dari daun berbintak dengan akurasi di atas 90 persen pada data uji, disertai analisis menjelaskan pola kesalahan yang tersisa.

Alur kerja deteksi penyakit dari foto daun banyak dipakai di dunia nyata karena petani dapat memotret daun langsung dari ponsel. Agar proyek berjalan di CPU dalam hitungan detik tanpa unduhan, kita memakai dataset daun sintetis 16x16 grayscale dua kelas — pola vena rapi untuk daun sehat, bercak gelap untuk daun sakit — yang dibangun oleh skrip generator dengan seed tetap. Struktur kodenya dirancang agar foto nyata (misalnya dari PlantVillage) dapat menggantikan data sintetis tanpa mengubah pipeline; cara penggantiannya dibahas pada data/README.md.

Prasyarat #

Sebelum masuk ke pengerjaan, pastikan materi berikut sudah dikuasai:

Perilaku Akhir yang Dituju #

Program terdiri atas empat skrip yang dijalankan berurutan dari folder proyek:

bash
python3 data/generate_data.py
python3 src/latih.py
python3 src/analisis_kesalahan.py

Skrip pertama membangun dataset (300 gambar) ke berkas .npz di /tmp; skrip kedua melatih CNN kecil sekitar delapan detik lalu menyimpan checkpoint; skrip ketiga memuat checkpoint dan membedah kesalahan pada data uji. Keluaran ringkas analisis_kesalahan.py tampak sebagai berikut (keluaran lengkap dibahas pada Bagian 5):

text
confusion matrix (baris = label, kolom = prediksi):
                  pred sehat  pred berbintak
label sehat               35               3
label berbintak            4              33

akurasi uji: 0.9067 (68/75)

Model mencapai akurasi uji 0.9067 — 68 dari 75 gambar benar, dengan 7 kesalahan yang justru menjadi bahan analisis paling berharga di Bagian 5. Kesalahan itu tidak tersebar acak: seluruh false negative berasal dari daun dengan satu bercak, sebuah pola yang kita buktikan dengan statistik bercak, bukan sekadar dugaan.

Struktur Berkas #

text
klasifikasi-penyakit-tanaman/
├── _index.md
├── bagian/                      # lima tahap pengerjaan
│   ├── mengumpulkan-dan-memeriksa-data/
│   ├── preprocessing-gambar/
│   ├── melatih-model/
│   ├── mengevaluasi-prediksi/
│   └── menganalisis-kesalahan/
├── data/
│   ├── generate_data.py         # generator daun sintetis 16x16
│   └── README.md                # asal data + cara ganti PlantVillage
├── src/
│   ├── dataset.py               # loader + normalisasi + pembagian
│   ├── model.py                 # class CNNDaun
│   ├── latih.py                 # pipeline pelatihan + checkpoint
│   ├── analisis_kesalahan.py    # confusion + sampel salah + statistik
│   └── __init__.py
├── tests/
│   ├── test_dataset.py          # uji loader dan determinisme data
│   └── test_model.py            # uji bentuk, parameter, backward
└── laporan/
    └── LAPORAN.md               # template laporan proyek

Seluruh berkas pada src/, tests/, dan data/ dapat diunduh dari bagian Berkas Sumber di bawah halaman ini dan setiap bagian pengerjaan.

Tahapan Pengerjaan #

Proyek dikerjakan dalam lima bagian berurutan, dan setiap bagian menghasilkan kode yang benar-benar dapat dijalankan:

  1. Bagian 1 — Mengumpulkan dan Memeriksa Data: membangun dataset daun sintetis dan memeriksa keseimbangan kelas serta isi gambar.
  2. Bagian 2 — Preprocessing Gambar: menormalkan piksel 0-255 menjadi 0-1 dan menyiapkan bentuk tensor untuk CNN.
  3. Bagian 3 — Melatih Model: menyusun arsitektur CNNDaun, DataLoader, training loop, dan checkpoint.
  4. Bagian 4 — Mengevaluasi Prediksi: membaca akurasi, confusion matrix, dan keyakinan prediksi per sampel.
  5. Bagian 5 — Menganalisis Kesalahan: membedah sampel salah dan membuktikan polanya lewat statistik bercak.

Mulailah dari Bagian 1 karena keputusan pada setiap tahap — termasuk keputusan mempertahankan kasus sulit satu bercak — baru terasa dampaknya pada hasil analisis di Bagian 5.