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:
- Arsitektur CNN — blok convolution dan pooling yang kita susun berlapis.
- Klasifikasi Gambar — kerangka umum tugas yang kita kerjakan.
- Dataset dan DataLoader — cara memberi batch data ke training loop.
- Training Loop
— cetakan
zero_gradhinggastep()yang dipakai ulang di sini. - Analisis Kesalahan — metode bedah kesalahan yang menjadi puncak proyek.
Perilaku Akhir yang Dituju #
Program terdiri atas empat skrip yang dijalankan berurutan dari folder proyek:
python3 data/generate_data.py
python3 src/latih.py
python3 src/analisis_kesalahan.pySkrip 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):
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 #
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 proyekSeluruh 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:
- Bagian 1 — Mengumpulkan dan Memeriksa Data: membangun dataset daun sintetis dan memeriksa keseimbangan kelas serta isi gambar.
- Bagian 2 — Preprocessing Gambar: menormalkan piksel 0-255 menjadi 0-1 dan menyiapkan bentuk tensor untuk CNN.
- Bagian 3 — Melatih Model: menyusun arsitektur CNNDaun, DataLoader, training loop, dan checkpoint.
- Bagian 4 — Mengevaluasi Prediksi: membaca akurasi, confusion matrix, dan keyakinan prediksi per sampel.
- 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.
Bangun dataset daun sintetis dua kelas, jalankan generatornya, lalu periksa keseimbangan kelas dan isi gambar sebelum melatih model.
Buka → # Bagian 2: Preprocessing GambarUbah gambar uint8 0-255 menjadi tensor float 0-1 dengan dimensi kanal, lalu bagi data latih dan uji secara stratified.
Buka → # Bagian 3: Melatih ModelRancang CNN kecil dua blok untuk gambar daun, susun DataLoader dan training loop, lalu latih sampai akurasi uji melampaui 90 persen.
Buka → # Bagian 4: Mengevaluasi PrediksiBaca confusion matrix hasil pelatihan, hitung precision dan recall untuk kelas berbintak, lalu periksa keyakinan model pada tiap sampel uji.
Buka → # Bagian 5: Menganalisis KesalahanBedah tujuh sampel yang diprediksi salah, lalu buktikan polanya dengan statistik bercak: seluruh false negative berasal dari daun berbercak satu.
Buka → # Buka → # Buka →